Clean the environment.

Set locations, and the working directory …


Defining phenotypes and datasets.

Create a new analysis directory, including subdirectories.
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE

Setting working directory and listing its contents.
[1] "/Users/slaan3/OneDrive - UMC Utrecht/PLINK/analyses/lookups/AE_20200512_COL_MKAVOUSI_MBOS_CHARGE_1000G_CAC/scRNAseq"
[1] "AESCRNA"          "scRNAseq.nb.html" "scRNAseq.Rmd"    

… a package-installation function …

… and load those packages.

We will create a datestamp and define the Utrecht Science Park Colour Scheme.

1 ERA-CVD ‘druggable-MI-targets’

For the ERA-CVD ‘druggable-MI-targets’ project (grantnumber: 01KL1802) we will perform two related RNA sequencing (RNAseq) experiments:

  1. conventional (‘bulk’) RNAseq using RNA extracted from carotid plaque samples, n ± 700. As of Thursday, March 11, 2021 all samples have been selected and RNA has been extracted; quality control (QC) was performed and we have a dataset of 635 samples.

  2. single-cell RNAseq (scRNAseq) of at least n = 40 samples (20 females, 20 males). As of Thursday, March 11, 2021 data is available of 40 samples (3 females, 15 males), we are extending sampling to get more female samples.

Plaque samples are derived from carotid endarterectomies as part of the Athero-Express Biobank Study which is an ongoing study in the UMC Utrecht.

2 Background

Here we map the CHARGE Consortium 1000G GWAS on coronary artery calcification (CAC) susceptibility loci to the single-cell carotid plaque data. These are given in:

  • IndSigSNPsforSander.xlsx
  • GeneList_15042020.xlsx
library(openxlsx)

CAC_gene_list <- read.xlsx(paste0(TARGET_loc, "/GeneList_15042020.xlsx"))

CAC_variants <- read.xlsx(paste0(TARGET_loc, "/IndSigSNPsforSander.xlsx"))


DT::datatable(CAC_gene_list)

DT::datatable(CAC_variants)
NA

We will construct a list of genes to map to our scRNAseq data.


target_genes <- unlist(CAC_gene_list$symbol)
target_genes
 [1] "PHACTR1"      "EDN1"         "GFOD1"        "TBC1D7"       "ENPP1"        "ENPP3"        "IGFBP3"       "AC011294.3"   "C9orf53"      "CDKN2B"       "RP11-145E5.5" "CDKN2A"       "MTAP"        
[14] "AL137026.1"   "ZNF32"        "ZNF485"       "ARID5B"       "RTKN2"        "ADK"          "AP3M1"        "CAMK2G"       "COMTD1"       "DUPD1"        "DUSP13"       "KAT6B"        "SAMD8"       
[27] "VCL"          "VDAC2"        "FGF23"        "COL4A2"       "ADAMTS7"      "CHRNB4"       "MORF4L1"      "CHRNA5"       "CTSH"         "APOE"         "APOC1"        "BCAM"         "PVRL2"       
[40] "TOMM40"       "RPL9"         "C6orf195"     "C12orf4"      "COL4A1"       "CETP"         "SMG6"         "PLEKHJ1"     

3 Load data

First we will load the data:

  • scRNAseq experimental data and rename the cell types.
  • Athero-Express clinical data.

3.1 AESCRNA: single-cell RNAseq from carotid plaques

Here we load the latest dataset from our Athero-Express Single Cell RNA experiment.


scRNAseqData <- readRDS(paste0(RAWDATA, "/Seuset_40_patients/Seuset_40_patients.RDS"))
scRNAseqData
An object of class Seurat 
38835 features across 6191 samples within 2 assays 
Active assay: SCT (18283 features, 3000 variable features)
 1 other assay present: RNA
 2 dimensional reductions calculated: pca, umap

The naming/classification is based on a combination conventional markers. We do not claim to know the exact identity of each cell, rather we refer to cells as ‘KIT+ Mast cells"-like cells. Likewise we refer to the cell clusters as ’communities’ of cells that exihibit similar properties, i.e. similar defining markers (e.g. KIT).

We will rename the cell types to human readable names.

### change names for clarity
backup.scRNAseqData = scRNAseqData
# get the old names to change to new names
UMAPPlot(scRNAseqData, label = FALSE, pt.size = 1.25, label.size = 4, group.by = "ident")


unique(scRNAseqData@active.ident)
 [1] CD14+CD68+ Macrophages II   CD3+CD4+ T Cells II         CD14+CD68+ Macrophages I    CD3+CD8+ T cells I          CD34+ Endothelial Cells II  CD3+CD8A+ T Cells II        Mixed Cells II             
 [8] Mixed Cells I               CD14+CD68+ Macrophages III  NCAM1+ Natural Killer Cells ACTA2+ Smooth Muscle Cells  CD34+ Endothelial Cells I   CD3+CD4+ T Cells III        KIT+ Mast Cells            
[15] CD79A+ B Cells I            CD3+CD4+ T Cells I          CD3+CD8 T cells III         CD79A+ B Cells II          
18 Levels: CD3+CD8 T cells III CD79A+ B Cells II KIT+ Mast Cells CD3+CD4+ T Cells III CD14+CD68+ Macrophages III CD79A+ B Cells I Mixed Cells II NCAM1+ Natural Killer Cells ... CD3+CD8+ T cells I
celltypes <- c("CD14+CD68+ Macrophages I" = "CD14+CD68+ M I", 
               "CD14+CD68+ Macrophages II" = "CD14+CD68+ M II", 
               "CD14+CD68+ Macrophages III" = "CD14+CD68+ M III",
               "CD3+CD8+ T cells I" = "CD3+CD8+ T I",
               "CD3+CD8A+ T Cells II" = "CD3+CD8A+ T II ", 
               "CD3+CD8 T cells III" = "CD3+CD8 T III", 
               "CD3+CD4+ T Cells I" = "CD3+CD4+ T I", 
               "CD3+CD4+ T Cells II" = "CD3+CD4+ T II", 
               "CD3+CD4+ T Cells III" = "CD3+CD4+ T III", 
               "CD34+ Endothelial Cells I" = "CD34+ EC I", 
               "CD34+ Endothelial Cells II" = "CD34+ EC II", 
               "Mixed Cells I" = "Mixed I", 
               "Mixed Cells II" = "Mixed II", 
               "ACTA2+ Smooth Muscle Cells" = "ACTA2+ SMC", 
               "NCAM1+ Natural Killer Cells" = "NCAM1+ NK", 
               "KIT+ Mast Cells" = "KIT+ MC",
               "CD79A+ B Cells I" = "CD79A+ B I", 
               "CD79A+ B Cells II" = "CD79A+ B II")

scRNAseqData <- Seurat::RenameIdents(object = scRNAseqData, 
                                       celltypes)
UMAPPlot(scRNAseqData, label = TRUE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)

3.2 Athero-Express Biobank Study: clinical data

Loading Athero-Express clinical data.

require(haven)

# AEDB <- haven::read_sav(paste0(AEDB_loc, "/2019-3NEW_AtheroExpressDatabase_ScientificAE_02072019_IC_added.sav"))
AEDB <- haven::read_sav(paste0(AEDB_loc, "/2020_1_NEW_AtheroExpressDatabase_ScientificAE_16-03-2020.sav"))

3.2.1 Fix clinical data

We need to be very strict in defining symptoms. Therefore we will fix a new variable that groups symptoms at inclusion.

Coding of symptoms is as follows:

  • missing -999
  • Asymptomatic 0
  • TIA 1
  • minor stroke 2
  • Major stroke 3
  • Amaurosis fugax 4
  • Four vessel disease 5
  • Vertebrobasilary TIA 7
  • Retinal infarction 8
  • Symptomatic, but aspecific symtoms 9
  • Contralateral symptomatic occlusion 10
  • retinal infarction 11
  • armclaudication due to occlusion subclavian artery, CEA needed for bypass 12
  • retinal infarction + TIAs 13
  • Ocular ischemic syndrome 14
  • ischemisch glaucoom 15
  • subclavian steal syndrome 16
  • TGA 17

We will group as follows:

  1. Asymptomatic > 0
  2. TIA > 1, 7, 13
  3. Stroke > 2, 3
  4. Ocular > 4, 14, 15
  5. Retinal infarction > 8, 11
  6. Other > 5, 9, 10, 12, 16, 17

# Fix symptoms

attach(AEDB)
AEDB[,"Symptoms.5G"] <- NA
AEDB$Symptoms.5G[sympt == 0] <- "Asymptomatic"
AEDB$Symptoms.5G[sympt == 1 | sympt == 7 | sympt == 13] <- "TIA"
AEDB$Symptoms.5G[sympt == 2 | sympt == 3] <- "Stroke"
AEDB$Symptoms.5G[sympt == 4 | sympt == 14 | sympt == 15 ] <- "Ocular"
AEDB$Symptoms.5G[sympt == 8 | sympt == 11] <- "Retinal infarction"
AEDB$Symptoms.5G[sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Other"


# AsymptSympt
AEDB[,"AsymptSympt"] <- NA
AEDB$AsymptSympt[sympt == -999] <- NA
AEDB$AsymptSympt[sympt == 0] <- "Asymptomatic"
AEDB$AsymptSympt[sympt == 1 | sympt == 7 | sympt == 13 | sympt == 2 | sympt == 3] <- "Symptomatic"
AEDB$AsymptSympt[sympt == 4 | sympt == 14 | sympt == 15 | sympt == 8 | sympt == 11 | sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Ocular and others"

# AsymptSympt
AEDB[,"AsymptSympt2G"] <- NA
AEDB$AsymptSympt2G[sympt == -999] <- NA
AEDB$AsymptSympt2G[sympt == 0] <- "Asymptomatic"
AEDB$AsymptSympt2G[sympt == 1 | sympt == 7 | sympt == 13 | sympt == 2 | sympt == 3 | sympt == 4 | sympt == 14 | sympt == 15 | sympt == 8 | sympt == 11 | sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Symptomatic"

detach(AEDB)

# table(AEDB$sympt, useNA = "ifany")
# table(AEDB$AsymptSympt2G, useNA = "ifany")
# table(AEDB$Symptoms.5G, useNA = "ifany")
# 
# table(AEDB$AsymptSympt2G, AEDB$sympt, useNA = "ifany")
# table(AEDB$Symptoms.5G, AEDB$sympt, useNA = "ifany")
table(AEDB$AsymptSympt2G, AEDB$Symptoms.5G, useNA = "ifany")
              
               Asymptomatic Ocular Other Retinal infarction Stroke  TIA <NA>
  Asymptomatic          333      0     0                  0      0    0    0
  Symptomatic             0    416   119                 43    732 1045    0
  <NA>                    0      0     0                  0      0    0 1103
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "sympt", "Symptoms.5G", "AsymptSympt"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# table(AEDB.temp$Symptoms.5G, AEDB.temp$AsymptSympt)
# 
# rm(AEDB.temp)

We will also fix the plaquephenotypes variable.

Coding of symptoms is as follows:

  • missing -999
  • not relevant -888
  • fibrous 1
  • fibroatheromatous 2
  • atheromatous 3

# Fix plaquephenotypes
attach(AEDB)
AEDB[,"OverallPlaquePhenotype"] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == 1] <- "fibrous"
AEDB$OverallPlaquePhenotype[plaquephenotype == 2] <- "fibroatheromatous"
AEDB$OverallPlaquePhenotype[plaquephenotype == 3] <- "atheromatous"
detach(AEDB)

# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "plaquephenotype", "OverallPlaquePhenotype"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the diabetes status variable.


# Fix diabetes
attach(AEDB)
AEDB[,"DiabetesStatus"] <- NA
AEDB$DiabetesStatus[DM.composite == -999] <- NA
AEDB$DiabetesStatus[DM.composite == 0] <- "Control (no Diabetes Dx/Med)"
AEDB$DiabetesStatus[DM.composite == 1] <- "Diabetes"
detach(AEDB)

table(AEDB$DM.composite, AEDB$DiabetesStatus)
   
    Control (no Diabetes Dx/Med) Diabetes
  0                         2764        0
  1                            0      985
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the smoking status variable. We are interested in whether someone never, ever or is currently (at the time of inclusion) smoking. This is based on the questionnaire.

  • diet801: are you a smoker?
  • diet802: did you smoke in the past?

We already have some variables indicating smoking status:

  • SmokingReported: patient has reported to smoke.
  • SmokingYearOR: smoking in the year of surgery?
  • SmokerCurrent: currently smoking?
require(labelled)
AEDB$diet801 <- to_factor(AEDB$diet801)
AEDB$diet802 <- to_factor(AEDB$diet802)
AEDB$diet805 <- to_factor(AEDB$diet805)
AEDB$SmokingReported <- to_factor(AEDB$SmokingReported)
AEDB$SmokerCurrent <- to_factor(AEDB$SmokerCurrent)
AEDB$SmokingYearOR <- to_factor(AEDB$SmokingYearOR)

# table(AEDB$diet801)
# table(AEDB$diet802)
# table(AEDB$SmokingReported)
# table(AEDB$SmokerCurrent)
# table(AEDB$SmokingYearOR)
# table(AEDB$SmokingReported, AEDB$SmokerCurrent, useNA = "ifany", dnn = c("Reported smoking", "Current smoker"))
# 
# table(AEDB$diet801, AEDB$diet802, useNA = "ifany", dnn = c("Smoker", "Past smoker"))

cat("\nFixing smoking status.\n")

Fixing smoking status.
attach(AEDB)
AEDB[,"SmokerStatus"] <- NA
AEDB$SmokerStatus[diet802 == "don't know"] <- "Never smoked"
AEDB$SmokerStatus[diet802 == "I still smoke"] <- "Current smoker"
AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "no"] <- "Never smoked"
AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "yes"] <- "Ex-smoker"
AEDB$SmokerStatus[SmokerCurrent == "yes"] <- "Current smoker"
AEDB$SmokerStatus[SmokerCurrent == "no data available/missing"] <- NA
# AEDB$SmokerStatus[is.na(SmokerCurrent)] <- "Never smoked"
detach(AEDB)

cat("\n* Current smoking status.\n")

* Current smoking status.
table(AEDB$SmokerCurrent,
      useNA = "ifany", 
      dnn = c("Current smoker"))
Current smoker
no data available/missing                        no                       yes                      <NA> 
                        0                      2364                      1308                       119 
cat("\n* Updated smoking status.\n")

* Updated smoking status.
table(AEDB$SmokerStatus,
      useNA = "ifany", 
      dnn = c("Updated smoking status"))
Updated smoking status
Current smoker      Ex-smoker   Never smoked           <NA> 
          1308           1814            389            280 
cat("\n* Comparing to 'SmokerCurrent'.\n")

* Comparing to 'SmokerCurrent'.
table(AEDB$SmokerStatus, AEDB$SmokerCurrent, 
      useNA = "ifany", 
      dnn = c("Updated smoking status", "Current smoker"))
                      Current smoker
Updated smoking status no data available/missing   no  yes <NA>
        Current smoker                         0    0 1308    0
        Ex-smoker                              0 1814    0    0
        Never smoked                           0  389    0    0
        <NA>                                   0  161    0  119
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the alcohol status variable.


# Fix diabetes
attach(AEDB)
AEDB[,"AlcoholUse"] <- NA
AEDB$AlcoholUse[diet810 == -999] <- NA
AEDB$AlcoholUse[diet810 == 0] <- "No"
AEDB$AlcoholUse[diet810 == 1] <- "Yes"
detach(AEDB)

# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "diet810", "AlcoholUse"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$AlcoholUse <- to_factor(AEDB.temp$AlcoholUse)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

3.2.2 Prepare baseline characteristics

We are interested in the following variables at baseline.

  • Age (years)
  • Female sex (N, %)
  • Hypertension (N, %)
  • SBP (mmHg)
  • DBP (mmHg)
  • Diabetes mellitus (N, %)
  • Total cholesterol levels (mg/dL)
  • LDL cholesterol levels (mg/dL)
  • HDL cholesterol levels (mg/dL)
  • Triglyceride levels (mg/dL)
  • Use of statins (N, %)
  • Use of antiplatelet drugs (N, %)
  • BMI (kg/m²)
  • Smoking status (N, %)
    • Never smokers
    • Ex-smokers
    • Current smokers
  • History of CAD (N, %)
  • History of PAD (N, %)
  • Clinical manifestations
    • Asymptomatic
    • Amaurosis fugax
    • TIA
    • Stroke
  • eGFR (mL/min/1.73 m²)
  • Testosterone (nmol/L)
cat("====================================================================================================\n")
====================================================================================================
cat("SELECTION THE SHIZZLE\n")
SELECTION THE SHIZZLE
### Artery levels
# AEdata$Artery_summary: 
#           value                                                                                   label
# NOT USE - 0 No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA
# USE - 1                                                                  carotid (left & right)
# USE - 2                                               femoral/iliac (left, right or both sides)
# NOT USE - 3                                               other carotid arteries (common, external)
# NOT USE - 4                                   carotid bypass and injury (left, right or both sides)
# NOT USE - 5                                                         aneurysmata (carotid & femoral)
# NOT USE - 6                                                                                   aorta
# NOT USE - 7                                            other arteries (renal, popliteal, vertebral)
# NOT USE - 8                        femoral bypass, angioseal and injury (left, right or both sides)

### AEdata$informedconsent
#           value                                                                                           label
# NOT USE - -999                                                                                         missing
# NOT USE - 0                                                                                        no, died
# USE - 1                                                                                             yes
# USE - 2                                                             yes, health treatment when possible
# USE - 3                                                                        yes, no health treatment
# USE - 4                                                yes, no health treatment, no commercial business
# NOT USE - 5                                                          yes, no tissue, no commerical business
# NOT USE - 6                      yes, no tissue, no questionnaires, no medical info, no commercial business
# USE - 7                             yes, no questionnaires, no health treatment, no commercial business
# USE - 8                                          yes, no questionnaires, health treatment when possible
# NOT USE - 9                  yes, no tissue, no questionnaires, no health treatment, no commerical business
# USE - 10                               yes, no health treatment, no medical info, no commercial business
# NOT USE - 11 yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business
# USE - 12                                                     yes, no questionnaires, no health treatment
# NOT USE - 13                                                             yes, no tissue, no health treatment
# NOT USE - 14                                                               yes, no tissue, no questionnaires
# NOT USE - 15                                                  yes, no tissue, health treatment when possible
# NOT USE - 16                                                                                  yes, no tissue
# USE - 17                                                                     yes, no commerical business
# USE - 18                                     yes, health treatment when possible, no commercial business
# USE - 19                                                    yes, no medical info, no commercial business
# USE - 20                                                                          yes, no questionnaires
# NOT USE - 21                         yes, no tissue, no questionnaires, no health treatment, no medical info
# NOT USE - 22                  yes, no tissue, no questionnaires, no health treatment, no commercial business
# USE - 23                                                                            yes, no medical info
# USE - 24                                                  yes, no questionnaires, no commercial business
# USE - 25                                    yes, no questionnaires, no health treatment, no medical info
# USE - 26                  yes, no questionnaires, health treatment when possible, no commercial business
# USE - 27                                                      yes,  no health treatment, no medical info
# NOT USE - 28                                                                             no, doesn't want to
# NOT USE - 29                                                                              no, unable to sign
# NOT USE - 30                                                                                 no, no reaction
# NOT USE - 31                                                                                        no, lost
# NOT USE - 32                                                                                     no, too old
# NOT USE - 34                                            yes, no medical info, health treatment when possible
# NOT USE - 35                                             no (never asked for IC because there was no tissue)
# USE - 36                    yes, no medical info, no commercial business, health treatment when possible
# NOT USE - 37                                                                                    no, endpoint
# USE - 38                                                         wil niets invullen, wel alles gebruiken
# USE - 39                                           second informed concents: yes, no commercial business
# NOT USE - 40                                                                              nooit geincludeerd

cat("- sanity checking PRIOR to selection")
- sanity checking PRIOR to selection
library(data.table)
require(labelled)
ae.gender <- to_factor(AEDB$Gender)
ae.hospital <- to_factor(AEDB$Hospital)
table(ae.gender, ae.hospital, dnn = c("Sex", "Hospital"))
        Hospital
Sex      St. Antonius, Nieuwegein UMC Utrecht
  female                      524         636
  male                       1211        1420
ae.artery <- to_factor(AEDB$Artery_summary)
table(ae.artery, ae.gender, dnn = c("Sex", "Artery"))
                                                                                         Artery
Sex                                                                                       female male
  No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA      0    0
  carotid (left & right)                                                                     805 1781
  femoral/iliac (left, right or both sides)                                                  320  796
  other carotid arteries (common, external)                                                   17   35
  carotid bypass and injury (left, right or both sides)                                        6    3
  aneurysmata (carotid & femoral)                                                              1    0
  aorta                                                                                        3    5
  other arteries (renal, popliteal, vertebral)                                                 4    9
  femoral bypass, angioseal and injury (left, right or both sides)                             4    2
rm(ae.gender, ae.hospital, ae.artery)

# I change numeric and factors manually because, well, I wouldn't know how to fix it otherwise
# to have this 'tibble' work with 'tableone'... :-)

AEDB$Age <- as.numeric(AEDB$Age)
AEDB$diastoli <- as.numeric(AEDB$diastoli)
AEDB$systolic <- as.numeric(AEDB$systolic)

AEDB$TC_finalCU <- as.numeric(AEDB$TC_finalCU)
AEDB$LDL_finalCU <- as.numeric(AEDB$LDL_finalCU)
AEDB$HDL_finalCU <- as.numeric(AEDB$HDL_finalCU)
AEDB$TG_finalCU <- as.numeric(AEDB$TG_finalCU)

AEDB$TC_final <- as.numeric(AEDB$TC_final)
AEDB$LDL_final <- as.numeric(AEDB$LDL_final)
AEDB$HDL_final <- as.numeric(AEDB$HDL_final)
AEDB$TG_final <- as.numeric(AEDB$TG_final)

AEDB$Age <- as.numeric(AEDB$Age)
AEDB$GFR_MDRD <- as.numeric(AEDB$GFR_MDRD)
AEDB$BMI <- as.numeric(AEDB$BMI)
AEDB$eCigarettes <- as.numeric(AEDB$eCigarettes)
AEDB$ePackYearsSmoking <- as.numeric(AEDB$ePackYearsSmoking)
AEDB$EP_composite_time <- as.numeric(AEDB$EP_composite_time)

AEDB$macmean0 <- as.numeric(AEDB$macmean0)
AEDB$smcmean0 <- as.numeric(AEDB$smcmean0)
AEDB$neutrophils <- as.numeric(AEDB$neutrophils)
AEDB$Mast_cells_plaque <- as.numeric(AEDB$Mast_cells_plaque)
AEDB$vessel_density_averaged <- as.numeric(AEDB$vessel_density_averaged)

require(labelled)
AEDB$ORyear <- to_factor(AEDB$ORyear)
AEDB$Gender <- to_factor(AEDB$Gender)
AEDB$Hospital <- to_factor(AEDB$Hospital)
AEDB$KDOQI <- to_factor(AEDB$KDOQI)
AEDB$BMI_WHO <- to_factor(AEDB$BMI_WHO)
AEDB$DiabetesStatus <- to_factor(AEDB$DiabetesStatus)
AEDB$SmokerStatus <- to_factor(AEDB$SmokerStatus)
AEDB$AlcoholUse <- to_factor(AEDB$AlcoholUse)

AEDB$Hypertension.selfreport <- to_factor(AEDB$Hypertension1)
AEDB$Hypertension.selfreportdrug <- to_factor(AEDB$Hypertension2)
AEDB$Hypertension.composite <- to_factor(AEDB$Hypertension.composite)
AEDB$Hypertension.drugs <- to_factor(AEDB$Hypertension.drugs)

AEDB$Med.anticoagulants <- to_factor(AEDB$Med.anticoagulants)
AEDB$Med.all.antiplatelet <- to_factor(AEDB$Med.all.antiplatelet)
AEDB$Med.Statin.LLD <- to_factor(AEDB$Med.Statin.LLD)

AEDB$Stroke_Dx <- to_factor(AEDB$Stroke_Dx)
AEDB$CAD_history <- to_factor(AEDB$CAD_history)
AEDB$PAOD <- to_factor(AEDB$PAOD)
AEDB$Peripheral.interv <- to_factor(AEDB$Peripheral.interv)

AEDB$sympt <- to_factor(AEDB$sympt)
AEDB$Symptoms.3g <- to_factor(AEDB$Symptoms.3g)
AEDB$Symptoms.4g <- to_factor(AEDB$Symptoms.4g)
AEDB$Symptoms.5G <- to_factor(AEDB$Symptoms.5G)
AEDB$AsymptSympt <- to_factor(AEDB$AsymptSympt)
AEDB$AsymptSympt2G <- to_factor(AEDB$AsymptSympt2G)

AEDB$restenos <- to_factor(AEDB$restenos)
AEDB$stenose <- to_factor(AEDB$stenose)
AEDB$EP_composite <- to_factor(AEDB$EP_composite)
AEDB$Macrophages.bin <- to_factor(AEDB$Macrophages.bin)
AEDB$SMC.bin <- to_factor(AEDB$SMC.bin)
AEDB$IPH.bin <- to_factor(AEDB$IPH.bin)
AEDB$Calc.bin <- to_factor(AEDB$Calc.bin)
AEDB$Collagen.bin <- to_factor(AEDB$Collagen.bin)
AEDB$Fat.bin_10 <- to_factor(AEDB$Fat.bin_10)
AEDB$Fat.bin_40 <- to_factor(AEDB$Fat.bin_40)
AEDB$OverallPlaquePhenotype <- to_factor(AEDB$OverallPlaquePhenotype)

AEDB$Artery_summary <- to_factor(AEDB$Artery_summary)

AEDB$informedconsent <- to_factor(AEDB$informedconsent)

AEDB.CEA <- subset(AEDB,
                    (Artery_summary == "carotid (left & right)" | Artery_summary == "other carotid arteries (common, external)") & # we only want carotids
                       informedconsent != "missing" & # we are really strict in selecting based on 'informed consent'!
                       informedconsent != "no, died" &
                       informedconsent != "yes, no tissue, no commerical business" &
                       informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
                       informedconsent != "yes, no tissue, no health treatment" &
                       informedconsent != "yes, no tissue, no questionnaires" &
                       informedconsent != "yes, no tissue, health treatment when possible" &
                       informedconsent != "yes, no tissue" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
                       informedconsent != "no, doesn't want to" &
                       informedconsent != "no, unable to sign" &
                       informedconsent != "no, no reaction" &
                       informedconsent != "no, lost" &
                       informedconsent != "no, too old" &
                       informedconsent != "yes, no medical info, health treatment when possible" &
                       informedconsent != "no (never asked for IC because there was no tissue)" &
                       informedconsent != "no, endpoint" &
                       informedconsent != "nooit geincludeerd" & 
                     !is.na(AsymptSympt2G))
# AEDB.CEA[1:10, 1:10]
dim(AEDB.CEA)
[1] 2421 1100
cat("===========================================================================================\n")
===========================================================================================
cat("CREATE BASELINE TABLE\n")
CREATE BASELINE TABLE
# Baseline table variables
basetable_vars = c("Hospital", "ORyear",
                   "Age", "Gender", 
                   "TC_finalCU", "LDL_finalCU", "HDL_finalCU", "TG_finalCU", 
                   "TC_final", "LDL_final", "HDL_final", "TG_final", 
                   "systolic", "diastoli", "GFR_MDRD", "BMI", 
                   "KDOQI", "BMI_WHO", 
                   "SmokerStatus", "AlcoholUse",
                   "DiabetesStatus", 
                   "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs", 
                   "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                   "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
                   "restenos", "stenose",
                   "CAD_history", "PAOD", "Peripheral.interv", 
                   "EP_composite", "EP_composite_time",
                   "macmean0", "smcmean0", "Macrophages.bin", "SMC.bin",
                   "neutrophils", "Mast_cells_plaque",
                   "IPH.bin", "vessel_density_averaged",
                   "Calc.bin", "Collagen.bin", 
                   "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype")

basetable_bin = c("Gender", 
                  "KDOQI", "BMI_WHO", 
                  "SmokerStatus", "AlcoholUse",
                  "DiabetesStatus", 
                  "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs", 
                  "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                  "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
                  "restenos", "stenose",
                  "CAD_history", "PAOD", "Peripheral.interv", 
                  "EP_composite", "Macrophages.bin", "SMC.bin",
                  "IPH.bin", 
                  "Calc.bin", "Collagen.bin", 
                  "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype")
# basetable_bin

basetable_con = basetable_vars[!basetable_vars %in% basetable_bin]
# basetable_con

3.2.3 Athero-Express Biobank Study: baseline characteristics

Showing the baseline table of the whole Athero-Express Biobank.

# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
AEDB.CEA.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                         # factorVars = basetable_bin,
                                         # strata = "Gender",
                                         data = AEDB.CEA, includeNA = TRUE), 
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE, 
                          format = "pf", 
                          contDigits = 3)[,1:3]
                                      
                                       level                                                                     Overall           Missing
  n                                                                                                                 2421                  
  Hospital % (freq)                    St. Antonius, Nieuwegein                                                     39.2 ( 948)     0.0   
                                       UMC Utrecht                                                                  60.8 (1473)           
  ORyear % (freq)                      No data available/missing                                                     0.0 (   0)     0.0   
                                       2002                                                                          3.3 (  81)           
                                       2003                                                                          6.5 ( 157)           
                                       2004                                                                          7.8 ( 190)           
                                       2005                                                                          7.6 ( 185)           
                                       2006                                                                          7.6 ( 183)           
                                       2007                                                                          6.3 ( 152)           
                                       2008                                                                          5.7 ( 138)           
                                       2009                                                                          7.5 ( 181)           
                                       2010                                                                          6.6 ( 159)           
                                       2011                                                                          6.7 ( 163)           
                                       2012                                                                          7.3 ( 176)           
                                       2013                                                                          6.2 ( 149)           
                                       2014                                                                          6.7 ( 163)           
                                       2015                                                                          3.1 (  76)           
                                       2016                                                                          3.5 (  85)           
                                       2017                                                                          2.7 (  65)           
                                       2018                                                                          2.7 (  66)           
                                       2019                                                                          2.1 (  52)           
  Age (mean (SD))                                                                                                 69.105 (9.302)    0.0   
  Gender % (freq)                      female                                                                       30.5 ( 738)     0.0   
                                       male                                                                         69.5 (1683)           
  TC_finalCU (mean (SD))                                                                                         184.803 (56.262)  38.0   
  LDL_finalCU (mean (SD))                                                                                        108.420 (41.744)  45.6   
  HDL_finalCU (mean (SD))                                                                                         46.435 (17.005)  41.7   
  TG_finalCU (mean (SD))                                                                                         151.216 (91.277)  42.8   
  TC_final (mean (SD))                                                                                             4.786 (1.457)   38.0   
  LDL_final (mean (SD))                                                                                            2.808 (1.081)   45.6   
  HDL_final (mean (SD))                                                                                            1.203 (0.440)   41.7   
  TG_final (mean (SD))                                                                                             1.709 (1.031)   42.8   
  systolic (mean (SD))                                                                                           152.419 (25.166)  11.3   
  diastoli (mean (SD))                                                                                            81.318 (25.188)  11.3   
  GFR_MDRD (mean (SD))                                                                                            73.121 (21.152)   5.4   
  BMI (mean (SD))                                                                                                 26.488 (3.977)    5.9   
  KDOQI % (freq)                       No data available/missing                                                     0.0 (   0)     5.5   
                                       Normal kidney function                                                       19.1 ( 462)           
                                       CKD 2 (Mild)                                                                 50.9 (1232)           
                                       CKD 3 (Moderate)                                                             22.8 ( 553)           
                                       CKD 4 (Severe)                                                                1.3 (  32)           
                                       CKD 5 (Failure)                                                               0.4 (  10)           
                                       <NA>                                                                          5.5 ( 132)           
  BMI_WHO % (freq)                     No data available/missing                                                     0.0 (   0)     5.9   
                                       Underweight                                                                   1.0 (  24)           
                                       Normal                                                                       35.1 ( 850)           
                                       Overweight                                                                   43.4 (1051)           
                                       Obese                                                                        14.5 ( 352)           
                                       <NA>                                                                          5.9 ( 144)           
  SmokerStatus % (freq)                Current smoker                                                               33.2 ( 803)     5.9   
                                       Ex-smoker                                                                    48.0 (1163)           
                                       Never smoked                                                                 12.9 ( 313)           
                                       <NA>                                                                          5.9 ( 142)           
  AlcoholUse % (freq)                  No                                                                           34.5 ( 835)     4.0   
                                       Yes                                                                          61.5 (1488)           
                                       <NA>                                                                          4.0 (  98)           
  DiabetesStatus % (freq)              Control (no Diabetes Dx/Med)                                                 75.2 (1820)     1.1   
                                       Diabetes                                                                     23.7 ( 574)           
                                       <NA>                                                                          1.1 (  27)           
  Hypertension.selfreport % (freq)     No data available/missing                                                     0.0 (   0)     3.2   
                                       no                                                                           24.3 ( 589)           
                                       yes                                                                          72.4 (1754)           
                                       <NA>                                                                          3.2 (  78)           
  Hypertension.selfreportdrug % (freq) No data available/missing                                                     0.0 (   0)     4.4   
                                       no                                                                           29.9 ( 725)           
                                       yes                                                                          65.6 (1589)           
                                       <NA>                                                                          4.4 ( 107)           
  Hypertension.composite % (freq)      No data available/missing                                                     0.0 (   0)     1.2   
                                       no                                                                           14.6 ( 353)           
                                       yes                                                                          84.3 (2040)           
                                       <NA>                                                                          1.2 (  28)           
  Hypertension.drugs % (freq)          No data available/missing                                                     0.0 (   0)     1.4   
                                       no                                                                           23.3 ( 565)           
                                       yes                                                                          75.3 (1823)           
                                       <NA>                                                                          1.4 (  33)           
  Med.anticoagulants % (freq)          No data available/missing                                                     0.0 (   0)     1.6   
                                       no                                                                           87.3 (2114)           
                                       yes                                                                          11.1 ( 269)           
                                       <NA>                                                                          1.6 (  38)           
  Med.all.antiplatelet % (freq)        No data available/missing                                                     0.0 (   0)     1.5   
                                       no                                                                           12.2 ( 295)           
                                       yes                                                                          86.3 (2090)           
                                       <NA>                                                                          1.5 (  36)           
  Med.Statin.LLD % (freq)              No data available/missing                                                     0.0 (   0)     1.4   
                                       no                                                                           20.3 ( 491)           
                                       yes                                                                          78.3 (1896)           
                                       <NA>                                                                          1.4 (  34)           
  Stroke_Dx % (freq)                   Missing                                                                       0.0 (   0)     6.9   
                                       No stroke diagnosed                                                          71.5 (1731)           
                                       Stroke diagnosed                                                             21.6 ( 524)           
                                       <NA>                                                                          6.9 ( 166)           
  sympt % (freq)                       missing                                                                       0.0 (   0)     0.0   
                                       Asymptomatic                                                                 11.2 ( 270)           
                                       TIA                                                                          39.7 ( 961)           
                                       minor stroke                                                                 16.8 ( 407)           
                                       Major stroke                                                                  9.8 ( 238)           
                                       Amaurosis fugax                                                              15.7 ( 379)           
                                       Four vessel disease                                                           1.6 (  38)           
                                       Vertebrobasilary TIA                                                          0.2 (   5)           
                                       Retinal infarction                                                            1.4 (  34)           
                                       Symptomatic, but aspecific symtoms                                            2.2 (  53)           
                                       Contralateral symptomatic occlusion                                           0.5 (  11)           
                                       retinal infarction                                                            0.2 (   6)           
                                       armclaudication due to occlusion subclavian artery, CEA needed for bypass     0.0 (   1)           
                                       retinal infarction + TIAs                                                     0.0 (   0)           
                                       Ocular ischemic syndrome                                                      0.7 (  16)           
                                       ischemisch glaucoom                                                           0.0 (   0)           
                                       subclavian steal syndrome                                                     0.1 (   2)           
                                       TGA                                                                           0.0 (   0)           
  Symptoms.5G % (freq)                 Asymptomatic                                                                 11.2 ( 270)     0.0   
                                       Ocular                                                                       16.3 ( 395)           
                                       Other                                                                         4.3 ( 105)           
                                       Retinal infarction                                                            1.7 (  40)           
                                       Stroke                                                                       26.6 ( 645)           
                                       TIA                                                                          39.9 ( 966)           
  AsymptSympt % (freq)                 Asymptomatic                                                                 11.2 ( 270)     0.0   
                                       Ocular and others                                                            22.3 ( 540)           
                                       Symptomatic                                                                  66.5 (1611)           
  AsymptSympt2G % (freq)               Asymptomatic                                                                 11.2 ( 270)     0.0   
                                       Symptomatic                                                                  88.8 (2151)           
  restenos % (freq)                    missing                                                                       0.0 (   0)     1.4   
                                       de novo                                                                      93.7 (2268)           
                                       restenosis                                                                    4.9 ( 118)           
                                       stenose bij angioseal na PTCA                                                 0.0 (   0)           
                                       <NA>                                                                          1.4 (  35)           
  stenose % (freq)                     missing                                                                       0.0 (   0)     2.0   
                                       0-49%                                                                         0.5 (  13)           
                                       50-70%                                                                        7.8 ( 189)           
                                       70-90%                                                                       46.6 (1127)           
                                       90-99%                                                                       38.3 ( 927)           
                                       100% (Occlusion)                                                              1.3 (  31)           
                                       NA                                                                            0.0 (   1)           
                                       50-99%                                                                        0.6 (  15)           
                                       70-99%                                                                        2.8 (  68)           
                                       99                                                                            0.1 (   2)           
                                       <NA>                                                                          2.0 (  48)           
  CAD_history % (freq)                 Missing                                                                       0.0 (   0)     1.9   
                                       No history CAD                                                               66.8 (1618)           
                                       History CAD                                                                  31.2 ( 756)           
                                       <NA>                                                                          1.9 (  47)           
  PAOD % (freq)                        missing/no data                                                               0.0 (   0)     2.0   
                                       no                                                                           77.5 (1876)           
                                       yes                                                                          20.5 ( 497)           
                                       <NA>                                                                          2.0 (  48)           
  Peripheral.interv % (freq)           no                                                                           77.2 (1868)     2.9   
                                       yes                                                                          19.9 ( 482)           
                                       <NA>                                                                          2.9 (  71)           
  EP_composite % (freq)                No data available.                                                            0.0 (   0)     5.0   
                                       No composite endpoints                                                       70.6 (1709)           
                                       Composite endpoints                                                          24.4 ( 590)           
                                       <NA>                                                                          5.0 ( 122)           
  EP_composite_time (mean (SD))                                                                                    2.479 (1.109)    5.2   
  macmean0 (mean (SD))                                                                                             0.768 (1.184)   29.7   
  smcmean0 (mean (SD))                                                                                             1.985 (2.381)   29.9   
  Macrophages.bin % (freq)             no/minor                                                                     34.9 ( 846)    24.1   
                                       moderate/heavy                                                               40.9 ( 991)           
                                       <NA>                                                                         24.1 ( 584)           
  SMC.bin % (freq)                     no/minor                                                                     24.9 ( 602)    23.8   
                                       moderate/heavy                                                               51.3 (1242)           
                                       <NA>                                                                         23.8 ( 577)           
  neutrophils (mean (SD))                                                                                        147.151 (419.998) 87.4   
  Mast_cells_plaque (mean (SD))                                                                                  164.488 (163.771) 90.0   
  IPH.bin % (freq)                     no                                                                           30.7 ( 744)    23.5   
                                       yes                                                                          45.8 (1108)           
                                       <NA>                                                                         23.5 ( 569)           
  vessel_density_averaged (mean (SD))                                                                              8.318 (6.388)   35.1   
  Calc.bin % (freq)                    no/minor                                                                     41.6 (1006)    23.4   
                                       moderate/heavy                                                               35.1 ( 849)           
                                       <NA>                                                                         23.4 ( 566)           
  Collagen.bin % (freq)                no/minor                                                                     15.8 ( 382)    23.6   
                                       moderate/heavy                                                               60.6 (1467)           
                                       <NA>                                                                         23.6 ( 572)           
  Fat.bin_10 % (freq)                   <10%                                                                        22.4 ( 542)    23.3   
                                        >10%                                                                        54.3 (1314)           
                                       <NA>                                                                         23.3 ( 565)           
  Fat.bin_40 % (freq)                  <40%                                                                         56.2 (1360)    23.3   
                                       >40%                                                                         20.5 ( 496)           
                                       <NA>                                                                         23.3 ( 565)           
  OverallPlaquePhenotype % (freq)      atheromatous                                                                 19.8 ( 480)    23.7   
                                       fibroatheromatous                                                            27.8 ( 672)           
                                       fibrous                                                                      28.7 ( 695)           
                                       <NA>                                                                         23.7 ( 574)           

3.3 AESCRNA: baseline characteristics

metadata <- scRNAseqData@meta.data %>% as_tibble()
scRNAseqDataMeta <- metadata %>% distinct(Patient, .keep_all = TRUE)
distinct: removed 6,154 rows (99%), 37 rows remaining
scRNAseqDataMetaAE <- merge(scRNAseqDataMeta, AEDB, by.x = "Patient", by.y = "STUDY_NUMBER", sort = FALSE, all.x = TRUE)
dim(scRNAseqDataMetaAE)
[1]   37 1123
# Replace missing data 
# Ref: https://cran.r-project.org/web/packages/naniar/vignettes/replace-with-na.html
require(naniar)

na_strings <- c("NA", "N A", "N / A", "N/A", "N/ A", 
                "Not Available", "Not available", 
                "missing", 
                "-999", "-99", 
                "No data available/missing", "No data available/Missing")
# Then you write ~.x %in% na_strings - which reads as “does this value occur in the list of NA strings”.

scRNAseqDataMetaAE %>%
  replace_with_na_all(condition = ~.x %in% na_strings)

cat("====================================================================================================")
====================================================================================================
cat("SELECTION THE SHIZZLE")
SELECTION THE SHIZZLE
cat("- sanity checking PRIOR to selection")
- sanity checking PRIOR to selection
library(data.table)
require(labelled)
ae.gender <- to_factor(scRNAseqDataMetaAE$Gender)
ae.hospital <- to_factor(scRNAseqDataMetaAE$Hospital)
table(ae.gender, ae.hospital, dnn = c("Sex", "Hospital"), useNA = "ifany")
        Hospital
Sex      St. Antonius, Nieuwegein UMC Utrecht <NA>
  female                        0          10    0
  male                          0          26    0
  <NA>                          0           0    1
ae.artery <- to_factor(scRNAseqDataMetaAE$Artery_summary)
table(ae.artery, ae.gender, dnn = c("Sex", "Artery"), useNA = "ifany")
                                                                                         Artery
Sex                                                                                       female male <NA>
  No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA      0    0    0
  carotid (left & right)                                                                      10   25    0
  femoral/iliac (left, right or both sides)                                                    0    0    0
  other carotid arteries (common, external)                                                    0    1    0
  carotid bypass and injury (left, right or both sides)                                        0    0    0
  aneurysmata (carotid & femoral)                                                              0    0    0
  aorta                                                                                        0    0    0
  other arteries (renal, popliteal, vertebral)                                                 0    0    0
  femoral bypass, angioseal and injury (left, right or both sides)                             0    0    0
  <NA>                                                                                         0    0    1
ae.ic <- to_factor(scRNAseqDataMetaAE$informedconsent)
table(ae.ic, ae.gender, useNA = "ifany")
                                                                                                 ae.gender
ae.ic                                                                                             female male <NA>
  missing                                                                                              0    0    0
  no, died                                                                                             0    0    0
  yes                                                                                                  5   14    0
  yes, health treatment when possible                                                                  2    7    0
  yes, no health treatment                                                                             1    2    0
  yes, no health treatment, no commercial business                                                     1    2    0
  yes, no tissue, no commerical business                                                               0    0    0
  yes, no tissue, no questionnaires, no medical info, no commercial business                           0    0    0
  yes, no questionnaires, no health treatment, no commercial business                                  0    0    0
  yes, no questionnaires, health treatment when possible                                               0    0    0
  yes, no tissue, no questionnaires, no health treatment, no commerical business                       0    0    0
  yes, no health treatment, no medical info, no commercial business                                    0    0    0
  yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business      0    0    0
  yes, no questionnaires, no health treatment                                                          0    0    0
  yes, no tissue, no health treatment                                                                  0    0    0
  yes, no tissue, no questionnaires                                                                    0    0    0
  yes, no tissue, health treatment when possible                                                       0    0    0
  yes, no tissue                                                                                       0    0    0
  yes, no commerical business                                                                          0    1    0
  yes, health treatment when possible, no commercial business                                          0    0    0
  yes, no medical info, no commercial business                                                         0    0    0
  yes, no questionnaires                                                                               0    0    0
  yes, no tissue, no questionnaires, no health treatment, no medical info                              0    0    0
  yes, no tissue, no questionnaires, no health treatment, no commercial business                       0    0    0
  yes, no medical info                                                                                 0    0    0
  yes, no questionnaires, no commercial business                                                       0    0    0
  yes, no questionnaires, no health treatment, no medical info                                         0    0    0
  yes, no questionnaires, health treatment when possible, no commercial business                       0    0    0
  yes,  no health treatment, no medical info                                                           0    0    0
  no, doesn't want to                                                                                  0    0    0
  no, unable to sign                                                                                   0    0    0
  no, no reaction                                                                                      0    0    0
  no, lost                                                                                             0    0    0
  no, too old                                                                                          0    0    0
  yes, no medical info, health treatment when possible                                                 1    0    0
  no (never asked for IC because there was no tissue)                                                  0    0    0
  yes, no medical info, no commercial business, health treatment when possible                         0    0    0
  no, endpoint                                                                                         0    0    0
  wil niets invullen, wel alles gebruiken                                                              0    0    0
  second informed concents: yes, no commercial business                                                0    0    0
  nooit geincludeerd                                                                                   0    0    0
  <NA>                                                                                                 0    0    1
rm(ae.gender, ae.hospital, ae.artery, ae.ic)


scRNAseqDataMetaAE.all <- subset(scRNAseqDataMetaAE,
                            (Artery_summary == "carotid (left & right)" | Artery_summary == "other carotid arteries (common, external)" ) & # we only want carotids
                              informedconsent != "missing" & # we are really strict in selecting based on 'informed consent'!
                              informedconsent != "no, died" &
                              informedconsent != "yes, no tissue, no commerical business" &
                              informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
                              informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
                              informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
                              informedconsent != "yes, no tissue, no health treatment" &
                              informedconsent != "yes, no tissue, no questionnaires" &
                              informedconsent != "yes, no tissue, health treatment when possible" &
                              informedconsent != "yes, no tissue" &
                              informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
                              informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
                              informedconsent != "no, doesn't want to" &
                              informedconsent != "no, unable to sign" &
                              informedconsent != "no, no reaction" &
                              informedconsent != "no, lost" &
                              informedconsent != "no, too old" &
                              informedconsent != "yes, no medical info, health treatment when possible" & 
                              informedconsent != "no (never asked for IC because there was no tissue)" &
                              informedconsent != "no, endpoint" &
                              informedconsent != "nooit geincludeerd")
# scRNAseqDataMetaAE.all[1:10, 1:10]
dim(scRNAseqDataMetaAE.all)
[1]   35 1123
# DT::datatable(scRNAseqDataMetaAE.all)

Showing the baseline table.

cat("===========================================================================================")
===========================================================================================
cat("CREATE BASELINE TABLE")
CREATE BASELINE TABLE
# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
scRNAseqDataMetaAE.all.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                                  # factorVars = basetable_bin,
                                                  # strata = "Gender",
                                                  data = scRNAseqDataMetaAE.all, includeNA = TRUE), 
                                   nonnormal = c(), 
                                   quote = FALSE, showAllLevels = TRUE,
                                   format = "p", 
                                   contDigits = 3)[,1:2]
These variables only have NA/NaN: macmean0 smcmean0 Macrophages.bin SMC.bin neutrophils Mast_cells_plaque IPH.bin vessel_density_averaged Calc.bin Collagen.bin Fat.bin_10 Fat.bin_40 OverallPlaquePhenotype  Dropped
                                 
                                  level                                                                     Overall          
  n                                                                                                              35          
  Hospital (%)                    St. Antonius, Nieuwegein                                                      0.0          
                                  UMC Utrecht                                                                 100.0          
  ORyear (%)                      No data available/missing                                                     0.0          
                                  2002                                                                          0.0          
                                  2003                                                                          0.0          
                                  2004                                                                          0.0          
                                  2005                                                                          0.0          
                                  2006                                                                          0.0          
                                  2007                                                                          0.0          
                                  2008                                                                          0.0          
                                  2009                                                                          0.0          
                                  2010                                                                          0.0          
                                  2011                                                                          0.0          
                                  2012                                                                          0.0          
                                  2013                                                                          0.0          
                                  2014                                                                          0.0          
                                  2015                                                                          0.0          
                                  2016                                                                          0.0          
                                  2017                                                                          0.0          
                                  2018                                                                         65.7          
                                  2019                                                                         34.3          
  Age (mean (SD))                                                                                            72.743 (8.176)  
  Gender (%)                      female                                                                       25.7          
                                  male                                                                         74.3          
  TC_finalCU (mean (SD))                                                                                    168.311 (47.773) 
  LDL_finalCU (mean (SD))                                                                                    96.971 (38.196) 
  HDL_finalCU (mean (SD))                                                                                    43.897 (10.171) 
  TG_finalCU (mean (SD))                                                                                    171.469 (109.939)
  TC_final (mean (SD))                                                                                        4.359 (1.237)  
  LDL_final (mean (SD))                                                                                       2.512 (0.989)  
  HDL_final (mean (SD))                                                                                       1.137 (0.263)  
  TG_final (mean (SD))                                                                                        1.938 (1.242)  
  systolic (mean (SD))                                                                                      153.265 (25.803) 
  diastoli (mean (SD))                                                                                       80.824 (16.129) 
  GFR_MDRD (mean (SD))                                                                                       83.278 (31.136) 
  BMI (mean (SD))                                                                                            26.477 (3.428)  
  KDOQI (%)                       No data available/missing                                                     0.0          
                                  Normal kidney function                                                       34.3          
                                  CKD 2 (Mild)                                                                 31.4          
                                  CKD 3 (Moderate)                                                             22.9          
                                  CKD 4 (Severe)                                                                0.0          
                                  CKD 5 (Failure)                                                               0.0          
                                  <NA>                                                                         11.4          
  BMI_WHO (%)                     No data available/missing                                                     0.0          
                                  Underweight                                                                   2.9          
                                  Normal                                                                       31.4          
                                  Overweight                                                                   42.9          
                                  Obese                                                                        14.3          
                                  <NA>                                                                          8.6          
  SmokerStatus (%)                Current smoker                                                               34.3          
                                  Ex-smoker                                                                    48.6          
                                  Never smoked                                                                 14.3          
                                  <NA>                                                                          2.9          
  AlcoholUse (%)                  No                                                                           37.1          
                                  Yes                                                                          57.1          
                                  <NA>                                                                          5.7          
  DiabetesStatus (%)              Control (no Diabetes Dx/Med)                                                 62.9          
                                  Diabetes                                                                     37.1          
  Hypertension.selfreport (%)     No data available/missing                                                     0.0          
                                  no                                                                           11.4          
                                  yes                                                                          85.7          
                                  <NA>                                                                          2.9          
  Hypertension.selfreportdrug (%) No data available/missing                                                     0.0          
                                  no                                                                           11.4          
                                  yes                                                                          85.7          
                                  <NA>                                                                          2.9          
  Hypertension.composite (%)      No data available/missing                                                     0.0          
                                  no                                                                            5.7          
                                  yes                                                                          94.3          
  Hypertension.drugs (%)          No data available/missing                                                     0.0          
                                  no                                                                            5.7          
                                  yes                                                                          91.4          
                                  <NA>                                                                          2.9          
  Med.anticoagulants (%)          No data available/missing                                                     0.0          
                                  no                                                                           88.6          
                                  yes                                                                           5.7          
                                  <NA>                                                                          5.7          
  Med.all.antiplatelet (%)        No data available/missing                                                     0.0          
                                  no                                                                           25.7          
                                  yes                                                                          71.4          
                                  <NA>                                                                          2.9          
  Med.Statin.LLD (%)              No data available/missing                                                     0.0          
                                  no                                                                           20.0          
                                  yes                                                                          77.1          
                                  <NA>                                                                          2.9          
  Stroke_Dx (%)                   Missing                                                                       0.0          
                                  No stroke diagnosed                                                          51.4          
                                  Stroke diagnosed                                                             48.6          
  sympt (%)                       missing                                                                       0.0          
                                  Asymptomatic                                                                 17.1          
                                  TIA                                                                          14.3          
                                  minor stroke                                                                 34.3          
                                  Major stroke                                                                  8.6          
                                  Amaurosis fugax                                                              14.3          
                                  Four vessel disease                                                           0.0          
                                  Vertebrobasilary TIA                                                          0.0          
                                  Retinal infarction                                                            2.9          
                                  Symptomatic, but aspecific symtoms                                            0.0          
                                  Contralateral symptomatic occlusion                                           0.0          
                                  retinal infarction                                                            2.9          
                                  armclaudication due to occlusion subclavian artery, CEA needed for bypass     0.0          
                                  retinal infarction + TIAs                                                     0.0          
                                  Ocular ischemic syndrome                                                      5.7          
                                  ischemisch glaucoom                                                           0.0          
                                  subclavian steal syndrome                                                     0.0          
                                  TGA                                                                           0.0          
  Symptoms.5G (%)                 Asymptomatic                                                                 17.1          
                                  Ocular                                                                       20.0          
                                  Other                                                                         0.0          
                                  Retinal infarction                                                            5.7          
                                  Stroke                                                                       42.9          
                                  TIA                                                                          14.3          
  AsymptSympt (%)                 Asymptomatic                                                                 17.1          
                                  Ocular and others                                                            25.7          
                                  Symptomatic                                                                  57.1          
  AsymptSympt2G (%)               Asymptomatic                                                                 17.1          
                                  Symptomatic                                                                  82.9          
  restenos (%)                    missing                                                                       0.0          
                                  de novo                                                                     100.0          
                                  restenosis                                                                    0.0          
                                  stenose bij angioseal na PTCA                                                 0.0          
  stenose (%)                     missing                                                                       0.0          
                                  0-49%                                                                         2.9          
                                  50-70%                                                                       17.1          
                                  70-90%                                                                       42.9          
                                  90-99%                                                                       17.1          
                                  100% (Occlusion)                                                              0.0          
                                  NA                                                                            0.0          
                                  50-99%                                                                        0.0          
                                  70-99%                                                                       20.0          
                                  99                                                                            0.0          
  CAD_history (%)                 Missing                                                                       0.0          
                                  No history CAD                                                               74.3          
                                  History CAD                                                                  25.7          
  PAOD (%)                        missing/no data                                                               0.0          
                                  no                                                                           85.7          
                                  yes                                                                          14.3          
  Peripheral.interv (%)           no                                                                           77.1          
                                  yes                                                                          20.0          
                                  <NA>                                                                          2.9          
  EP_composite (%)                No data available.                                                            0.0          
                                  No composite endpoints                                                       42.9          
                                  Composite endpoints                                                          11.4          
                                  <NA>                                                                         45.7          
  EP_composite_time (mean (SD))                                                                               0.931 (0.483)  

Writing the baseline table to Excel format.

# Write basetable
require(openxlsx)
write.xlsx(file = paste0(OUT_loc, "/",Today,".",PROJECTNAME,".AE.BaselineTable.scRNAseq.xlsx"), 
           format(scRNAseqDataMetaAE.all.tableOne, digits = 5, scientific = FALSE) , row.names = TRUE, col.names = TRUE)

4 AESCRNA

4.1 Quality control

Here review the number of cells per sample, plate, and patients. And plot the ratio’s per sample and study number.

## check stuff
cat("\nHow many cells per type ...?")

How many cells per type ...?
sort(table(scRNAseqData@meta.data$SCT_snn_res.0.8))

  17   16   15   14   13   12   11   10    9    8    7    6    5    4    3    2    1    0 
  31   34   84  110  151  172  190  203  211  225  290  345  437  534  577  626  861 1110 
cat("\n\nHow many cells per plate ...?")


How many cells per plate ...?
sort(table(scRNAseqData@meta.data$ID))

4530.P1 4440.P1 4472.P1 4478.P1 4477.P1 4500.P1 4458.P1 4459.P1 4447.P2 4447.P3 4487.P2 4502.P1 4455.P1 4496.P1 4501.P1 4447.P1 4489.P1 4476.P1 4448.P1 4487.P1 4571.P1 4495.P1 4432.P1 4520.P1 4450.P2 
      4      11      32      40      41      45      47      48      51      66      75      80      82      88      93      96     102     104     105     112     112     115     129     130     134 
4545.P1 4513.P1 4452.P3 4453.P3 4452.P2 4450.P1 4558.P1 4535.P1 4488.P1 4480.P1 4470.P1 4450.P3 4453.P1 4486.P1 4452.P1 4546.P1 4443.P2 4491.P1 4453.P2 4530.P2 4443.P1 4521.P2 4443.P3 4542.P1 
    135     139     141     143     155     157     157     158     159     161     165     166     177     179     183     188     189     193     197     207     209     212     239     240 
cat("\n\nHow many cells per type per plate ...?")


How many cells per type per plate ...?
table(scRNAseqData@meta.data$SCT_snn_res.0.8, scRNAseqData@meta.data$ID)
    
     4432.P1 4440.P1 4443.P1 4443.P2 4443.P3 4447.P1 4447.P2 4447.P3 4448.P1 4450.P1 4450.P2 4450.P3 4452.P1 4452.P2 4452.P3 4453.P1 4453.P2 4453.P3 4455.P1 4458.P1 4459.P1 4470.P1 4472.P1 4476.P1 4477.P1
  0       28       2      31      56      53       8       7      12      22      15      22      22       5      15      21      19      20      23      10       5       2      44       1      10      11
  1       23       0       0       1       0       0       0       0      27      13      10      11       7      17      14      18      27      17       9       2       9      25       5      21      12
  2       18       1      15      11       8       9       5       4      11      20      23      25       4       8       8       7       4       6      19       8       9      16      10       8       2
  3        2       0       3       4       4       4       3       8       0      27      20      50     134      48      32      42      78      12       2       2       0       2       0       7       0
  4       14       2       5       7       5       2       3       2       6      12       5       5       7      10       6      33      15      19      10       1       2      23       0       7       2
  5       11       3      21      22      28       5       6       5       7       9       4       5       5       6       4      17      14      14       5       6       6       5       3      13       1
  6        1       1      66      46      73      15       1       4       3       4       7       6       4      10      13      18      10      26       3       1       3      20       0       0       0
  7        4       0      14       6       4       8       4       6       3      31      24      10       5       9      14       4       2       5       0       2       1       7       3       3       0
  8        9       0      10       2       5       4       3       7       4       2       5       4       0       2       2       1       3       1       4       2       0       4       3       3       1
  9        3       1       3       2       2       8       5       8       8      14       4       8       2       3       2       0       0       2       1       8       0       0       0       1       0
  10       7       0       5       6       1       2       2       0       2       2       3       6       3       4       2       1       4       2       7       2       2       1       4       4       1
  11       0       1       7       5       2      23      11       8       0       0       5       3       0       8       7       1       2       5       3       2       6       7       1      10       5
  12       4       0       8       7      11       0       0       0       9       0       0       5       3       6       6       2      11       3       3       0       4       7       1       2       5
  13       1       0      20       7      40       6       0       0       1       0       1       1       0       0       1       0       1       0       2       1       1       2       0       1       0
  14       1       0       0       1       1       1       0       1       1       5       1       3       1       2       6       4       3       1       2       3       0       0       0       9       0
  15       0       0       1       5       1       1       1       1       0       1       0       1       3       6       2       4       3       3       1       2       1       2       1       2       0
  16       1       0       0       0       1       0       0       0       0       0       0       0       0       0       1       2       0       3       0       0       2       0       0       2       0
  17       2       0       0       1       0       0       0       0       1       2       0       1       0       1       0       4       0       1       1       0       0       0       0       1       1
    
     4478.P1 4480.P1 4486.P1 4487.P1 4487.P2 4488.P1 4489.P1 4491.P1 4495.P1 4496.P1 4500.P1 4501.P1 4502.P1 4513.P1 4520.P1 4521.P2 4530.P1 4530.P2 4535.P1 4542.P1 4545.P1 4546.P1 4558.P1 4571.P1
  0        7      15      38      15       5      28      30      38      12       7       9      28      25      29      23      43       0      29      32      78      57      44      44      10
  1        7      51      21      27      21      44      20      51      29       9       4      28      17      24      20      48       1      12      24      41      17      38      28      11
  2        6      16      31      18      11      10       4      11      14      49       5      10       1       9      13      13       1      72      12      11       1       8      11      30
  3        1       3       7       0      14       1       0       1       2       3       6       3       2       2       7      14       1       9       1       2       6       3       3       2
  4        1       1       7       1       2       4      11      16      15       3       3       2      17      29       8      32       0      17      45      13      14      64      22       4
  5        5      17       5      11       4       8       4      22      14       4       8       3       5      17       7      14       1      18      12      12       3       4       3      11
  6        0       0       1       9       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
  7        1      12      19       5       0      18       4       2       3       1       1       3       0       1       1       0       0       3       1      23       4       4       7       8
  8        4       2      12       7       2       6       9       5       6       1       0       1       2      14      19       1       0      25       2       5       8       1       3       9
  9        1       3      14       6       1      17       4       9       1       2       0       1       1       4       7       2       0       2       0      37       5       2       5       2
  10       0      12       3       2       1       2       4      18       7       3       0       7       1       4       3       4       0       4      12       5       6      12      19       1
  11       1       9       8       0      11       2       3       2       5       0       2       5       2       1       7       5       0       0       2       1       1       1       0       0
  12       4       8       4       4       1      16       2       9       1       0       0       0       7       4       0       6       0       0       4       1       1       2       1       0
  13       0       0       1       3       0       1       0       3       0       1       0       0       0       0       1      20       0       5       0       3       5       1       6      15
  14       1       2       0       1       1       1       3       1       4       1       5       0       0       1      11       2       0       6       7       2       6       3       2       4
  15       1       8       6       2       1       0       1       4       1       2       0       1       0       0       1       6       0       0       2       2       0       1       2       1
  16       0       2       2       0       0       1       0       0       1       1       2       1       0       0       0       1       0       1       2       3       1       0       0       4
  17       0       0       0       1       0       0       3       1       0       1       0       0       0       0       2       1       0       4       0       1       0       0       1       0
cat("\n\nHow many cells per patient ...?")


How many cells per patient ...?
sort(table(scRNAseqData@meta.data$Patient))

4440 4472 4478 4477 4500 4458 4459 4502 4455 4496 4501 4489 4476 4448 4571 4495 4432 4520 4545 4513 4558 4535 4488 4480 4470 4486 4487 4546 4491 4530 4521 4447 4542 4450 4452 4453 4443 
  11   32   40   41   45   47   48   80   82   88   93  102  104  105  112  115  129  130  135  139  157  158  159  161  165  179  187  188  193  211  212  213  240  457  479  517  637 
cat("\n\nVisualizing these ratio's per study number and sample ...?")


Visualizing these ratio's per study number and sample ...?
UMAPPlot(scRNAseqData, label = TRUE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)
ggsave(paste0(PLOT_loc, "/", Today, ".UMAP.png"), plot = last_plot())
Saving 7.29 x 4.51 in image
ggsave(paste0(PLOT_loc, "/", Today, ".UMAP.ps"), plot = last_plot())
Saving 7.29 x 4.51 in image

barplot(prop.table(x = table(scRNAseqData@active.ident, scRNAseqData@meta.data$Patient)), 
        cex.axis = 1.0, cex.names = 0.5, las = 1,
        col = uithof_color, xlab = "study number", legend.text = FALSE, args.legend = list(x = "bottom"))
dev.copy(pdf, paste0(QC_loc, "/", Today, ".cell_ratios_per_sample.pdf"))
pdf 
  3 
dev.off()
quartz_off_screen 
                2 

barplot(prop.table(x = table(scRNAseqData@active.ident, scRNAseqData@meta.data$ID)), 
        cex.axis = 1.0, cex.names = 0.5, las = 2,
        col = uithof_color, xlab = "sample ID", legend.text = FALSE, args.legend = list(x = "bottom"))
dev.copy(pdf, paste0(QC_loc, "/", Today, ".cell_ratios_per_sample_per_plate.pdf"))
pdf 
  3 
dev.off()
quartz_off_screen 
                2 

4.2 Visualisations

Let’s project known cellular markers.


UMAPPlot(scRNAseqData, label = FALSE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)


# endothelial cells
FeaturePlot(scRNAseqData, features = c("CD34"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("EDN1"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("EDNRA", "EDNRB"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CDH5", "PECAM1"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("ACKR1"), cols =  c("#ECECEC", "#DB003F"))


# SMC
FeaturePlot(scRNAseqData, features = c("MYH11"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("LGALS3", "ACTA2"), cols =  c("#ECECEC", "#DB003F"))


# macrophages
FeaturePlot(scRNAseqData, features = c("CD14", "CD68"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CD36"), cols =  c("#ECECEC", "#DB003F"))


# t-cells
FeaturePlot(scRNAseqData, features = c("CD3E"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CD4"), cols =  c("#ECECEC", "#DB003F"))

# FeaturePlot(scRNAseqData, features = c("CD8"), cols =  c("#ECECEC", "#DB003F"))

# b-cells
FeaturePlot(scRNAseqData, features = c("CD79A"), cols =  c("#ECECEC", "#DB003F"))


# mast cells
FeaturePlot(scRNAseqData, features = c("KIT"), cols =  c("#ECECEC", "#DB003F"))


# NK cells
FeaturePlot(scRNAseqData, features = c("NCAM1"), cols =  c("#ECECEC", "#DB003F"))

4.3 Targets of interest:

We check whether the targets genes, PHACTR1, EDN1, GFOD1, TBC1D7, ENPP1, ENPP3, IGFBP3, AC011294.3, C9orf53, CDKN2B, RP11-145E5.5, CDKN2A, MTAP, AL137026.1, ZNF32, ZNF485, ARID5B, RTKN2, ADK, AP3M1, CAMK2G, COMTD1, DUPD1, DUSP13, KAT6B, SAMD8, VCL, VDAC2, FGF23, COL4A2, ADAMTS7, CHRNB4, MORF4L1, CHRNA5, CTSH, APOE, APOC1, BCAM, PVRL2, TOMM40, RPL9, C6orf195, C12orf4, COL4A1, CETP, SMG6, PLEKHJ1, were sequenced using our method (STARseq).

Several genes are not present or have different names, these are listed here, and were manually removed from/changed in the list.

  • AC011294.3 ==> not found
  • C6orf195 => LINC01600 replacement, not found
  • C9orf53 => CDKN2A-DT replacement, not found
  • AL137026.1 ==> not found
  • DUPD1 => DUSP29 replacement, not found
  • RP11-145E5.5 ==> not found
  • PVRL2 => NECTIN2 replacement
  • KIAA1462 => JCAD replacement
  • ZNF32 ==> not found
  • BCAM ==> not found
target_genes
 [1] "PHACTR1"      "EDN1"         "GFOD1"        "TBC1D7"       "ENPP1"        "ENPP3"        "IGFBP3"       "AC011294.3"   "C9orf53"      "CDKN2B"       "RP11-145E5.5" "CDKN2A"       "MTAP"        
[14] "AL137026.1"   "ZNF32"        "ZNF485"       "ARID5B"       "RTKN2"        "ADK"          "AP3M1"        "CAMK2G"       "COMTD1"       "DUPD1"        "DUSP13"       "KAT6B"        "SAMD8"       
[27] "VCL"          "VDAC2"        "FGF23"        "COL4A2"       "ADAMTS7"      "CHRNB4"       "MORF4L1"      "CHRNA5"       "CTSH"         "APOE"         "APOC1"        "BCAM"         "PVRL2"       
[40] "TOMM40"       "RPL9"         "C6orf195"     "C12orf4"      "COL4A1"       "CETP"         "SMG6"         "PLEKHJ1"     

4.3.1 Expression in cell communities


target_genes_rm <- c("AC011294.3", "C6orf195", "C9orf53", "AL137026.1", "DUPD1", "RP11-145E5.5", "PVRL2",
                     "RP1-257A7.4", "RP1-257A7.5", "KIAA1462",
                     "ZNF32", "BCAM")

temp = target_genes[!target_genes %in% target_genes_rm]

target_genes_qc <- c(temp, "NECTIN2", "JCAD")

target_genes_qc
 [1] "PHACTR1" "EDN1"    "GFOD1"   "TBC1D7"  "ENPP1"   "ENPP3"   "IGFBP3"  "CDKN2B"  "CDKN2A"  "MTAP"    "ZNF485"  "ARID5B"  "RTKN2"   "ADK"     "AP3M1"   "CAMK2G"  "COMTD1"  "DUSP13"  "KAT6B"   "SAMD8"  
[21] "VCL"     "VDAC2"   "FGF23"   "COL4A2"  "ADAMTS7" "CHRNB4"  "MORF4L1" "CHRNA5"  "CTSH"    "APOE"    "APOC1"   "TOMM40"  "RPL9"    "C12orf4" "COL4A1"  "CETP"    "SMG6"    "PLEKHJ1" "NECTIN2" "JCAD"   
library(RColorBrewer)

p1 <- DotPlot(scRNAseqData, features = target_genes_qc,
        cols = "RdBu")

p1 + theme(axis.text.x = element_text(angle = 45, hjust=1, size = 5))

ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.Targets.png"), plot = last_plot())
ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.Targets.ps"), plot = last_plot())


rm(p1)

# FeaturePlot(scRNAseqData, features = c(target_genes_qc),
#             cols =  c("#ECECEC", "#DB003F", "#9A3480","#1290D9"),
#             combine = TRUE)
# 
# ggsave(paste0(PLOT_loc, "/", Today, ".FeaturePlot.Targets.png"), plot = last_plot())
# ggsave(paste0(PLOT_loc, "/", Today, ".FeaturePlot.Targets.ps"), plot = last_plot())
# VlnPlot(scRNAseqData, features = "DUSP29")

for (GENE in target_genes_qc){
  print(paste0("Projecting the expression of ", GENE, "."))

  vp1 <-  VlnPlot(scRNAseqData, features = GENE) + 
    xlab("cell communities") + 
    ylab(bquote("normalized expression")) +
    theme(axis.title.x = element_text(color = "#000000", size = 14, face = "bold"), 
            axis.title.y = element_text(color = "#000000", size = 14, face = "bold"), 
            legend.position = "none")
    ggsave(paste0(PLOT_loc, "/", Today, ".VlnPlot.",GENE,".png"), plot = last_plot())
    ggsave(paste0(PLOT_loc, "/", Today, ".VlnPlot.",GENE,".ps"), plot = last_plot())
  
  # print(vp1)
  
}
[1] "Projecting the expression of PHACTR1."
Saving 7 x 7 in image
[1] "Projecting the expression of EDN1."
[1] "Projecting the expression of GFOD1."
[1] "Projecting the expression of TBC1D7."
[1] "Projecting the expression of ENPP1."
[1] "Projecting the expression of ENPP3."
[1] "Projecting the expression of IGFBP3."
[1] "Projecting the expression of CDKN2B."
[1] "Projecting the expression of CDKN2A."
[1] "Projecting the expression of MTAP."
[1] "Projecting the expression of ZNF485."
[1] "Projecting the expression of ARID5B."
[1] "Projecting the expression of RTKN2."
[1] "Projecting the expression of ADK."
[1] "Projecting the expression of AP3M1."
[1] "Projecting the expression of CAMK2G."
[1] "Projecting the expression of COMTD1."
[1] "Projecting the expression of DUSP13."
[1] "Projecting the expression of KAT6B."
[1] "Projecting the expression of SAMD8."
[1] "Projecting the expression of VCL."
[1] "Projecting the expression of VDAC2."
[1] "Projecting the expression of FGF23."
[1] "Projecting the expression of COL4A2."
[1] "Projecting the expression of ADAMTS7."
[1] "Projecting the expression of CHRNB4."
[1] "Projecting the expression of MORF4L1."
[1] "Projecting the expression of CHRNA5."
[1] "Projecting the expression of CTSH."
[1] "Projecting the expression of APOE."
[1] "Projecting the expression of APOC1."
[1] "Projecting the expression of TOMM40."
[1] "Projecting the expression of RPL9."
[1] "Projecting the expression of C12orf4."
[1] "Projecting the expression of COL4A1."
[1] "Projecting the expression of CETP."
[1] "Projecting the expression of SMG6."
[1] "Projecting the expression of PLEKHJ1."
[1] "Projecting the expression of NECTIN2."
[1] "Projecting the expression of JCAD."

4.3.2 Differential expression between cell communities

Here we project genes to only the broad cell communities:

  • macrophages
  • endothelial cells
  • smooth muscle cells
  • T-cells
  • B-cells
  • Mast cells
  • NK-cells
  • Mixed cells

4.3.2.1 Macrophages

Comparison between the macrophages cell communities (CD14/CD68+), and all other communities.

N_GENES=20552
MAC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III"), 
                          ident.2 = c(#"CD14+CD68+ M I", 
                                      #"CD14+CD68+ M II", 
                                      #"CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8 T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+CD4+ T III", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC", 
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

DT::datatable(MAC.markers)
MAC_Volcano_TargetsA = EnhancedVolcano(MAC.markers,
    lab = rownames(MAC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Macrophage markers\n(Macrophage communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
MAC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.MAC.DEG.Targets.pdf"), 
       plot = MAC_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
MAC.markers <- add_column(MAC.markers, Gene = row.names(MAC.markers), .before = 1)

temp <- MAC.markers[MAC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".MAC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.2 Smooth muscle cells

Comparison between the smooth muscle cell communities (ACTA2+), and all other communities.

N_GENES=20552
SMC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("ACTA2+ SMC"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8 T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+CD4+ T III", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      # "ACTA2+ SMC", 
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~54s          
  |++                                                | 2 % ~49s          
  |++                                                | 3 % ~47s          
  |+++                                               | 4 % ~46s          
  |+++                                               | 5 % ~45s          
  |++++                                              | 6 % ~44s          
  |++++                                              | 7 % ~43s          
  |+++++                                             | 9 % ~43s          
  |+++++                                             | 10% ~46s          
  |++++++                                            | 11% ~44s          
  |++++++                                            | 12% ~43s          
  |+++++++                                           | 13% ~42s          
  |+++++++                                           | 14% ~41s          
  |++++++++                                          | 15% ~40s          
  |++++++++                                          | 16% ~39s          
  |+++++++++                                         | 17% ~38s          
  |++++++++++                                        | 18% ~38s          
  |++++++++++                                        | 19% ~37s          
  |+++++++++++                                       | 20% ~36s          
  |+++++++++++                                       | 21% ~36s          
  |++++++++++++                                      | 22% ~35s          
  |++++++++++++                                      | 23% ~35s          
  |+++++++++++++                                     | 24% ~34s          
  |+++++++++++++                                     | 26% ~33s          
  |++++++++++++++                                    | 27% ~33s          
  |++++++++++++++                                    | 28% ~32s          
  |+++++++++++++++                                   | 29% ~32s          
  |+++++++++++++++                                   | 30% ~31s          
  |++++++++++++++++                                  | 31% ~31s          
  |++++++++++++++++                                  | 32% ~30s          
  |+++++++++++++++++                                 | 33% ~30s          
  |++++++++++++++++++                                | 34% ~29s          
  |++++++++++++++++++                                | 35% ~29s          
  |+++++++++++++++++++                               | 36% ~28s          
  |+++++++++++++++++++                               | 37% ~28s          
  |++++++++++++++++++++                              | 38% ~27s          
  |++++++++++++++++++++                              | 39% ~26s          
  |+++++++++++++++++++++                             | 40% ~26s          
  |+++++++++++++++++++++                             | 41% ~25s          
  |++++++++++++++++++++++                            | 43% ~25s          
  |++++++++++++++++++++++                            | 44% ~24s          
  |+++++++++++++++++++++++                           | 45% ~24s          
  |+++++++++++++++++++++++                           | 46% ~23s          
  |++++++++++++++++++++++++                          | 47% ~23s          
  |++++++++++++++++++++++++                          | 48% ~22s          
  |+++++++++++++++++++++++++                         | 49% ~22s          
  |+++++++++++++++++++++++++                         | 50% ~21s          
  |++++++++++++++++++++++++++                        | 51% ~21s          
  |+++++++++++++++++++++++++++                       | 52% ~20s          
  |+++++++++++++++++++++++++++                       | 53% ~20s          
  |++++++++++++++++++++++++++++                      | 54% ~19s          
  |++++++++++++++++++++++++++++                      | 55% ~19s          
  |+++++++++++++++++++++++++++++                     | 56% ~18s          
  |+++++++++++++++++++++++++++++                     | 57% ~18s          
  |++++++++++++++++++++++++++++++                    | 59% ~18s          
  |++++++++++++++++++++++++++++++                    | 60% ~17s          
  |+++++++++++++++++++++++++++++++                   | 61% ~17s          
  |+++++++++++++++++++++++++++++++                   | 62% ~17s          
  |++++++++++++++++++++++++++++++++                  | 63% ~16s          
  |++++++++++++++++++++++++++++++++                  | 64% ~16s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~15s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~15s          
  |++++++++++++++++++++++++++++++++++                | 67% ~14s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~14s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~14s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~14s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~13s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~13s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~12s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~12s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~11s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~11s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~10s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~10s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=44s  
DT::datatable(SMC.markers)
SMC_Volcano_TargetsA = EnhancedVolcano(SMC.markers,
    lab = rownames(SMC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "SMC markers\n(SMC communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
SMC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.SMC.DEG.Targets.pdf"), 
       plot = SMC_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
SMC.markers <- add_column(SMC.markers, Gene = row.names(SMC.markers), .before = 1)

temp <- SMC.markers[SMC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".SMC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.3 Endothelial cells

Comparison between the endothelial cell communities (CD34+), and all other communities.

N_GENES=20552
EC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD34+ EC I", "CD34+ EC II"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8 T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+CD4+ T III", 
                                      # "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC",
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~45s          
  |++                                                | 2 % ~54s          
  |++                                                | 3 % ~48s          
  |+++                                               | 4 % ~45s          
  |+++                                               | 5 % ~43s          
  |++++                                              | 6 % ~41s          
  |++++                                              | 8 % ~41s          
  |+++++                                             | 9 % ~39s          
  |+++++                                             | 10% ~38s          
  |++++++                                            | 11% ~38s          
  |++++++                                            | 12% ~37s          
  |+++++++                                           | 13% ~37s          
  |+++++++                                           | 14% ~37s          
  |++++++++                                          | 15% ~37s          
  |+++++++++                                         | 16% ~36s          
  |+++++++++                                         | 17% ~35s          
  |++++++++++                                        | 18% ~46s          
  |++++++++++                                        | 19% ~45s          
  |+++++++++++                                       | 20% ~44s          
  |+++++++++++                                       | 22% ~43s          
  |++++++++++++                                      | 23% ~42s          
  |++++++++++++                                      | 24% ~41s          
  |+++++++++++++                                     | 25% ~40s          
  |+++++++++++++                                     | 26% ~39s          
  |++++++++++++++                                    | 27% ~38s          
  |++++++++++++++                                    | 28% ~37s          
  |+++++++++++++++                                   | 29% ~36s          
  |++++++++++++++++                                  | 30% ~35s          
  |++++++++++++++++                                  | 31% ~34s          
  |+++++++++++++++++                                 | 32% ~34s          
  |+++++++++++++++++                                 | 33% ~33s          
  |++++++++++++++++++                                | 34% ~32s          
  |++++++++++++++++++                                | 35% ~32s          
  |+++++++++++++++++++                               | 37% ~31s          
  |+++++++++++++++++++                               | 38% ~30s          
  |++++++++++++++++++++                              | 39% ~30s          
  |++++++++++++++++++++                              | 40% ~29s          
  |+++++++++++++++++++++                             | 41% ~29s          
  |+++++++++++++++++++++                             | 42% ~28s          
  |++++++++++++++++++++++                            | 43% ~27s          
  |+++++++++++++++++++++++                           | 44% ~27s          
  |+++++++++++++++++++++++                           | 45% ~26s          
  |++++++++++++++++++++++++                          | 46% ~25s          
  |++++++++++++++++++++++++                          | 47% ~25s          
  |+++++++++++++++++++++++++                         | 48% ~24s          
  |+++++++++++++++++++++++++                         | 49% ~24s          
  |++++++++++++++++++++++++++                        | 51% ~23s          
  |++++++++++++++++++++++++++                        | 52% ~22s          
  |+++++++++++++++++++++++++++                       | 53% ~22s          
  |+++++++++++++++++++++++++++                       | 54% ~21s          
  |++++++++++++++++++++++++++++                      | 55% ~21s          
  |++++++++++++++++++++++++++++                      | 56% ~20s          
  |+++++++++++++++++++++++++++++                     | 57% ~19s          
  |++++++++++++++++++++++++++++++                    | 58% ~19s          
  |++++++++++++++++++++++++++++++                    | 59% ~18s          
  |+++++++++++++++++++++++++++++++                   | 60% ~18s          
  |+++++++++++++++++++++++++++++++                   | 61% ~17s          
  |++++++++++++++++++++++++++++++++                  | 62% ~17s          
  |++++++++++++++++++++++++++++++++                  | 63% ~16s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~16s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~15s          
  |++++++++++++++++++++++++++++++++++                | 67% ~15s          
  |++++++++++++++++++++++++++++++++++                | 68% ~14s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~14s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~13s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~13s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~12s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~12s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~12s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~11s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~11s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~10s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~10s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=42s  
DT::datatable(EC.markers)
EC_Volcano_TargetsA = EnhancedVolcano(EC.markers,
    lab = rownames(EC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Endothelial cell markers\n(EC communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
EC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.EC.DEG.Targets.pdf"), 
       plot = EC_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
EC.markers <- add_column(EC.markers, Gene = row.names(EC.markers), .before = 1)

temp <- EC.markers[EC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".EC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.4 T-cells

Comparison between the T-cell communities (CD3/CD4/CD8+), and all other communities.

N_GENES=20552
TC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD3+CD8+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8 T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+CD4+ T III"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      # "CD3+CD8+ T I",
                                      # "CD3+CD8A+ T II ", 
                                      # "CD3+CD8 T III", 
                                      # "CD3+CD4+ T I", 
                                      # "CD3+CD4+ T II", 
                                      # "CD3+CD4+ T III", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC",
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~33s          
  |++                                                | 2 % ~33s          
  |++                                                | 3 % ~32s          
  |+++                                               | 4 % ~30s          
  |+++                                               | 5 % ~29s          
  |++++                                              | 6 % ~28s          
  |++++                                              | 7 % ~28s          
  |+++++                                             | 9 % ~33s          
  |+++++                                             | 10% ~32s          
  |++++++                                            | 11% ~30s          
  |++++++                                            | 12% ~29s          
  |+++++++                                           | 13% ~28s          
  |+++++++                                           | 14% ~28s          
  |++++++++                                          | 15% ~27s          
  |++++++++                                          | 16% ~26s          
  |+++++++++                                         | 17% ~26s          
  |++++++++++                                        | 18% ~25s          
  |++++++++++                                        | 19% ~25s          
  |+++++++++++                                       | 20% ~24s          
  |+++++++++++                                       | 21% ~24s          
  |++++++++++++                                      | 22% ~23s          
  |++++++++++++                                      | 23% ~23s          
  |+++++++++++++                                     | 24% ~22s          
  |+++++++++++++                                     | 26% ~22s          
  |++++++++++++++                                    | 27% ~22s          
  |++++++++++++++                                    | 28% ~21s          
  |+++++++++++++++                                   | 29% ~21s          
  |+++++++++++++++                                   | 30% ~21s          
  |++++++++++++++++                                  | 31% ~20s          
  |++++++++++++++++                                  | 32% ~20s          
  |+++++++++++++++++                                 | 33% ~20s          
  |++++++++++++++++++                                | 34% ~19s          
  |++++++++++++++++++                                | 35% ~19s          
  |+++++++++++++++++++                               | 36% ~19s          
  |+++++++++++++++++++                               | 37% ~19s          
  |++++++++++++++++++++                              | 38% ~18s          
  |++++++++++++++++++++                              | 39% ~18s          
  |+++++++++++++++++++++                             | 40% ~18s          
  |+++++++++++++++++++++                             | 41% ~17s          
  |++++++++++++++++++++++                            | 43% ~17s          
  |++++++++++++++++++++++                            | 44% ~17s          
  |+++++++++++++++++++++++                           | 45% ~16s          
  |+++++++++++++++++++++++                           | 46% ~16s          
  |++++++++++++++++++++++++                          | 47% ~16s          
  |++++++++++++++++++++++++                          | 48% ~15s          
  |+++++++++++++++++++++++++                         | 49% ~15s          
  |+++++++++++++++++++++++++                         | 50% ~15s          
  |++++++++++++++++++++++++++                        | 51% ~14s          
  |+++++++++++++++++++++++++++                       | 52% ~14s          
  |+++++++++++++++++++++++++++                       | 53% ~14s          
  |++++++++++++++++++++++++++++                      | 54% ~13s          
  |++++++++++++++++++++++++++++                      | 55% ~13s          
  |+++++++++++++++++++++++++++++                     | 56% ~13s          
  |+++++++++++++++++++++++++++++                     | 57% ~12s          
  |++++++++++++++++++++++++++++++                    | 59% ~12s          
  |++++++++++++++++++++++++++++++                    | 60% ~12s          
  |+++++++++++++++++++++++++++++++                   | 61% ~11s          
  |+++++++++++++++++++++++++++++++                   | 62% ~11s          
  |++++++++++++++++++++++++++++++++                  | 63% ~11s          
  |++++++++++++++++++++++++++++++++                  | 64% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~10s          
  |++++++++++++++++++++++++++++++++++                | 67% ~10s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~10s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~09s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~09s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~09s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~08s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=30s  
DT::datatable(TC.markers)
TC_Volcano_TargetsA = EnhancedVolcano(TC.markers,
    lab = rownames(TC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "T-cell markers\n(T-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
TC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.TC.DEG.Targets.pdf"), 
       plot = TC_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
TC.markers <- add_column(TC.markers, Gene = row.names(TC.markers), .before = 1)

temp <- TC.markers[TC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".TC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.5 B-cells

Comparison between the B-cell communities (CD79A+), and all other communities.

N_GENES=20552
BC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD79A+ B I", 
                                      "CD79A+ B II"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8 T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+CD4+ T III", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC",
                                      "NCAM1+ NK", 
                                      "KIT+ MC"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~20s          
  |++                                                | 2 % ~20s          
  |++                                                | 3 % ~23s          
  |+++                                               | 4 % ~22s          
  |+++                                               | 5 % ~21s          
  |++++                                              | 6 % ~20s          
  |++++                                              | 7 % ~20s          
  |+++++                                             | 8 % ~19s          
  |+++++                                             | 9 % ~19s          
  |++++++                                            | 10% ~19s          
  |++++++                                            | 11% ~18s          
  |+++++++                                           | 12% ~18s          
  |+++++++                                           | 13% ~18s          
  |++++++++                                          | 14% ~18s          
  |++++++++                                          | 15% ~17s          
  |+++++++++                                         | 16% ~17s          
  |+++++++++                                         | 17% ~17s          
  |++++++++++                                        | 18% ~17s          
  |++++++++++                                        | 19% ~16s          
  |+++++++++++                                       | 20% ~16s          
  |+++++++++++                                       | 21% ~16s          
  |++++++++++++                                      | 22% ~16s          
  |++++++++++++                                      | 23% ~16s          
  |+++++++++++++                                     | 24% ~15s          
  |+++++++++++++                                     | 26% ~15s          
  |++++++++++++++                                    | 27% ~15s          
  |++++++++++++++                                    | 28% ~15s          
  |+++++++++++++++                                   | 29% ~15s          
  |+++++++++++++++                                   | 30% ~14s          
  |++++++++++++++++                                  | 31% ~14s          
  |++++++++++++++++                                  | 32% ~14s          
  |+++++++++++++++++                                 | 33% ~14s          
  |+++++++++++++++++                                 | 34% ~14s          
  |++++++++++++++++++                                | 35% ~13s          
  |++++++++++++++++++                                | 36% ~13s          
  |+++++++++++++++++++                               | 37% ~13s          
  |+++++++++++++++++++                               | 38% ~13s          
  |++++++++++++++++++++                              | 39% ~13s          
  |++++++++++++++++++++                              | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~12s          
  |+++++++++++++++++++++                             | 42% ~12s          
  |++++++++++++++++++++++                            | 43% ~12s          
  |++++++++++++++++++++++                            | 44% ~11s          
  |+++++++++++++++++++++++                           | 45% ~11s          
  |+++++++++++++++++++++++                           | 46% ~11s          
  |++++++++++++++++++++++++                          | 47% ~11s          
  |++++++++++++++++++++++++                          | 48% ~11s          
  |+++++++++++++++++++++++++                         | 49% ~10s          
  |+++++++++++++++++++++++++                         | 50% ~10s          
  |++++++++++++++++++++++++++                        | 51% ~10s          
  |+++++++++++++++++++++++++++                       | 52% ~10s          
  |+++++++++++++++++++++++++++                       | 53% ~10s          
  |++++++++++++++++++++++++++++                      | 54% ~09s          
  |++++++++++++++++++++++++++++                      | 55% ~09s          
  |+++++++++++++++++++++++++++++                     | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~09s          
  |++++++++++++++++++++++++++++++                    | 58% ~08s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |+++++++++++++++++++++++++++++++                   | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |++++++++++++++++++++++++++++++++                  | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 63% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |++++++++++++++++++++++++++++++++++                | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=20s  
DT::datatable(BC.markers)
BC_Volcano_TargetsA = EnhancedVolcano(BC.markers,
    lab = rownames(BC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "B-cell markers\n(B-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
BC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.BC.DEG.Targets.pdf"), 
       plot = BC_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
BC.markers <- add_column(BC.markers, Gene = row.names(BC.markers), .before = 1)

temp <- BC.markers[BC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".BC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.6 Mast cells

Comparison between the mast cell communities (KIT+), and all other communities.

N_GENES=20552
MC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("KIT+ MC"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8 T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+CD4+ T III", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC",
                                      "NCAM1+ NK", 
                                      # "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~31s          
  |++                                                | 2 % ~31s          
  |++                                                | 3 % ~30s          
  |+++                                               | 4 % ~29s          
  |+++                                               | 5 % ~28s          
  |++++                                              | 6 % ~27s          
  |++++                                              | 7 % ~27s          
  |+++++                                             | 8 % ~26s          
  |+++++                                             | 9 % ~26s          
  |++++++                                            | 10% ~25s          
  |++++++                                            | 11% ~25s          
  |+++++++                                           | 12% ~25s          
  |+++++++                                           | 13% ~25s          
  |++++++++                                          | 14% ~24s          
  |++++++++                                          | 15% ~24s          
  |+++++++++                                         | 16% ~24s          
  |+++++++++                                         | 17% ~23s          
  |++++++++++                                        | 18% ~23s          
  |++++++++++                                        | 19% ~23s          
  |+++++++++++                                       | 20% ~23s          
  |+++++++++++                                       | 21% ~22s          
  |++++++++++++                                      | 22% ~22s          
  |++++++++++++                                      | 23% ~22s          
  |+++++++++++++                                     | 24% ~21s          
  |+++++++++++++                                     | 25% ~22s          
  |++++++++++++++                                    | 26% ~21s          
  |++++++++++++++                                    | 27% ~21s          
  |+++++++++++++++                                   | 28% ~21s          
  |+++++++++++++++                                   | 29% ~20s          
  |++++++++++++++++                                  | 30% ~20s          
  |++++++++++++++++                                  | 31% ~20s          
  |+++++++++++++++++                                 | 32% ~19s          
  |+++++++++++++++++                                 | 33% ~19s          
  |++++++++++++++++++                                | 34% ~19s          
  |++++++++++++++++++                                | 35% ~18s          
  |+++++++++++++++++++                               | 36% ~18s          
  |+++++++++++++++++++                               | 37% ~18s          
  |++++++++++++++++++++                              | 38% ~17s          
  |++++++++++++++++++++                              | 39% ~17s          
  |+++++++++++++++++++++                             | 40% ~17s          
  |+++++++++++++++++++++                             | 41% ~17s          
  |++++++++++++++++++++++                            | 42% ~16s          
  |++++++++++++++++++++++                            | 43% ~16s          
  |+++++++++++++++++++++++                           | 44% ~16s          
  |+++++++++++++++++++++++                           | 45% ~15s          
  |++++++++++++++++++++++++                          | 46% ~15s          
  |++++++++++++++++++++++++                          | 47% ~17s          
  |+++++++++++++++++++++++++                         | 48% ~16s          
  |+++++++++++++++++++++++++                         | 49% ~16s          
  |++++++++++++++++++++++++++                        | 51% ~16s          
  |++++++++++++++++++++++++++                        | 52% ~15s          
  |+++++++++++++++++++++++++++                       | 53% ~15s          
  |+++++++++++++++++++++++++++                       | 54% ~15s          
  |++++++++++++++++++++++++++++                      | 55% ~14s          
  |++++++++++++++++++++++++++++                      | 56% ~14s          
  |+++++++++++++++++++++++++++++                     | 57% ~14s          
  |+++++++++++++++++++++++++++++                     | 58% ~13s          
  |++++++++++++++++++++++++++++++                    | 59% ~13s          
  |++++++++++++++++++++++++++++++                    | 60% ~13s          
  |+++++++++++++++++++++++++++++++                   | 61% ~12s          
  |+++++++++++++++++++++++++++++++                   | 62% ~12s          
  |++++++++++++++++++++++++++++++++                  | 63% ~12s          
  |++++++++++++++++++++++++++++++++                  | 64% ~11s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~11s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~11s          
  |++++++++++++++++++++++++++++++++++                | 67% ~10s          
  |++++++++++++++++++++++++++++++++++                | 68% ~10s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~10s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~10s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~10s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~09s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~09s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~09s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=32s  
DT::datatable(MC.markers)
MC_Volcano_TargetsA = EnhancedVolcano(MC.markers,
    lab = rownames(MC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Mast cell markers\n(Mast cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
MC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.MC.DEG.Targets.pdf"), 
       plot = MC_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
MC.markers <- add_column(MC.markers, Gene = row.names(MC.markers), .before = 1)

temp <- MC.markers[MC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".MC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.7 NK-cells

Comparison between the natural killer cell communities (NCAM1+), and all other communities.

N_GENES=20552
NK.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("NCAM1+ NK"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8 T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+CD4+ T III", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I",
                                      "Mixed II",
                                      "ACTA2+ SMC", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~16s          
  |++                                                | 2 % ~17s          
  |++                                                | 3 % ~16s          
  |+++                                               | 4 % ~16s          
  |+++                                               | 5 % ~16s          
  |++++                                              | 6 % ~15s          
  |++++                                              | 7 % ~15s          
  |+++++                                             | 8 % ~15s          
  |+++++                                             | 9 % ~15s          
  |++++++                                            | 10% ~14s          
  |++++++                                            | 11% ~14s          
  |+++++++                                           | 12% ~14s          
  |+++++++                                           | 13% ~14s          
  |++++++++                                          | 14% ~14s          
  |++++++++                                          | 15% ~14s          
  |+++++++++                                         | 16% ~14s          
  |+++++++++                                         | 17% ~13s          
  |++++++++++                                        | 18% ~13s          
  |++++++++++                                        | 19% ~13s          
  |+++++++++++                                       | 20% ~13s          
  |+++++++++++                                       | 21% ~13s          
  |++++++++++++                                      | 22% ~12s          
  |++++++++++++                                      | 23% ~12s          
  |+++++++++++++                                     | 24% ~12s          
  |+++++++++++++                                     | 25% ~12s          
  |++++++++++++++                                    | 26% ~12s          
  |++++++++++++++                                    | 27% ~12s          
  |+++++++++++++++                                   | 28% ~11s          
  |+++++++++++++++                                   | 29% ~11s          
  |++++++++++++++++                                  | 30% ~11s          
  |++++++++++++++++                                  | 31% ~11s          
  |+++++++++++++++++                                 | 32% ~11s          
  |+++++++++++++++++                                 | 33% ~11s          
  |++++++++++++++++++                                | 34% ~11s          
  |++++++++++++++++++                                | 35% ~11s          
  |+++++++++++++++++++                               | 36% ~10s          
  |+++++++++++++++++++                               | 37% ~11s          
  |++++++++++++++++++++                              | 38% ~11s          
  |++++++++++++++++++++                              | 39% ~10s          
  |+++++++++++++++++++++                             | 40% ~10s          
  |+++++++++++++++++++++                             | 41% ~10s          
  |++++++++++++++++++++++                            | 42% ~10s          
  |++++++++++++++++++++++                            | 43% ~10s          
  |+++++++++++++++++++++++                           | 44% ~09s          
  |+++++++++++++++++++++++                           | 45% ~09s          
  |++++++++++++++++++++++++                          | 46% ~09s          
  |++++++++++++++++++++++++                          | 47% ~09s          
  |+++++++++++++++++++++++++                         | 48% ~09s          
  |+++++++++++++++++++++++++                         | 49% ~08s          
  |++++++++++++++++++++++++++                        | 51% ~08s          
  |++++++++++++++++++++++++++                        | 52% ~08s          
  |+++++++++++++++++++++++++++                       | 53% ~08s          
  |+++++++++++++++++++++++++++                       | 54% ~08s          
  |++++++++++++++++++++++++++++                      | 55% ~07s          
  |++++++++++++++++++++++++++++                      | 56% ~07s          
  |+++++++++++++++++++++++++++++                     | 57% ~07s          
  |+++++++++++++++++++++++++++++                     | 58% ~07s          
  |++++++++++++++++++++++++++++++                    | 59% ~07s          
  |++++++++++++++++++++++++++++++                    | 60% ~07s          
  |+++++++++++++++++++++++++++++++                   | 61% ~06s          
  |+++++++++++++++++++++++++++++++                   | 62% ~06s          
  |++++++++++++++++++++++++++++++++                  | 63% ~06s          
  |++++++++++++++++++++++++++++++++                  | 64% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~06s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |++++++++++++++++++++++++++++++++++                | 68% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=18s  
DT::datatable(NK.markers)
NK_Volcano_TargetsA = EnhancedVolcano(NK.markers,
    lab = rownames(NK.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "NK markers\n(NK-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
NK_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.NK.DEG.Targets.pdf"), 
       plot = NK_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
NK.markers <- add_column(NK.markers, Gene = row.names(NK.markers), .before = 1)

temp <- NK.markers[NK.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".NK.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.8 Mixed cells

Comparison between the mixed cell communities, and all other communities.

N_GENES=20552
MIXED.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("Mixed I", 
                                      "Mixed II"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8 T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+CD4+ T III", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      # "Mixed I", 
                                      # "Mixed II", 
                                      "ACTA2+ SMC", 
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 05s      
  |++                                                | 2 % ~58s          
  |++                                                | 3 % ~54s          
  |+++                                               | 4 % ~51s          
  |+++                                               | 5 % ~50s          
  |++++                                              | 6 % ~48s          
  |++++                                              | 7 % ~48s          
  |+++++                                             | 8 % ~48s          
  |+++++                                             | 9 % ~47s          
  |++++++                                            | 10% ~46s          
  |++++++                                            | 11% ~46s          
  |+++++++                                           | 12% ~45s          
  |+++++++                                           | 13% ~44s          
  |++++++++                                          | 14% ~44s          
  |++++++++                                          | 15% ~43s          
  |+++++++++                                         | 16% ~43s          
  |+++++++++                                         | 17% ~42s          
  |++++++++++                                        | 18% ~41s          
  |++++++++++                                        | 19% ~41s          
  |+++++++++++                                       | 20% ~40s          
  |+++++++++++                                       | 21% ~40s          
  |++++++++++++                                      | 22% ~39s          
  |++++++++++++                                      | 23% ~39s          
  |+++++++++++++                                     | 24% ~38s          
  |+++++++++++++                                     | 26% ~38s          
  |++++++++++++++                                    | 27% ~37s          
  |++++++++++++++                                    | 28% ~37s          
  |+++++++++++++++                                   | 29% ~36s          
  |+++++++++++++++                                   | 30% ~35s          
  |++++++++++++++++                                  | 31% ~35s          
  |++++++++++++++++                                  | 32% ~35s          
  |+++++++++++++++++                                 | 33% ~34s          
  |+++++++++++++++++                                 | 34% ~33s          
  |++++++++++++++++++                                | 35% ~33s          
  |++++++++++++++++++                                | 36% ~32s          
  |+++++++++++++++++++                               | 37% ~32s          
  |+++++++++++++++++++                               | 38% ~32s          
  |++++++++++++++++++++                              | 39% ~32s          
  |++++++++++++++++++++                              | 40% ~31s          
  |+++++++++++++++++++++                             | 41% ~30s          
  |+++++++++++++++++++++                             | 42% ~30s          
  |++++++++++++++++++++++                            | 43% ~29s          
  |++++++++++++++++++++++                            | 44% ~29s          
  |+++++++++++++++++++++++                           | 45% ~28s          
  |+++++++++++++++++++++++                           | 46% ~27s          
  |++++++++++++++++++++++++                          | 47% ~27s          
  |++++++++++++++++++++++++                          | 48% ~26s          
  |+++++++++++++++++++++++++                         | 49% ~26s          
  |+++++++++++++++++++++++++                         | 50% ~25s          
  |++++++++++++++++++++++++++                        | 51% ~25s          
  |+++++++++++++++++++++++++++                       | 52% ~24s          
  |+++++++++++++++++++++++++++                       | 53% ~24s          
  |++++++++++++++++++++++++++++                      | 54% ~23s          
  |++++++++++++++++++++++++++++                      | 55% ~23s          
  |+++++++++++++++++++++++++++++                     | 56% ~22s          
  |+++++++++++++++++++++++++++++                     | 57% ~22s          
  |++++++++++++++++++++++++++++++                    | 58% ~21s          
  |++++++++++++++++++++++++++++++                    | 59% ~20s          
  |+++++++++++++++++++++++++++++++                   | 60% ~20s          
  |+++++++++++++++++++++++++++++++                   | 61% ~19s          
  |++++++++++++++++++++++++++++++++                  | 62% ~19s          
  |++++++++++++++++++++++++++++++++                  | 63% ~18s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~18s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~17s          
  |++++++++++++++++++++++++++++++++++                | 66% ~17s          
  |++++++++++++++++++++++++++++++++++                | 67% ~16s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~16s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~15s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~15s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~14s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~14s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~13s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~13s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~12s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~12s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~12s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~11s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=51s  
DT::datatable(MIXED.markers)
MIXED_Volcano_TargetsA = EnhancedVolcano(MIXED.markers,
    lab = rownames(MIXED.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Mixed markers\n(Mixed cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
MIXED_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.MIXED.DEG.Targets.pdf"), 
       plot = MIXED_Volcano_TargetsA)

The target results are given below and written to a file.

library(tibble)
MIXED.markers <- add_column(MIXED.markers, Gene = row.names(MIXED.markers), .before = 1)

temp <- MIXED.markers[MIXED.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".MIXED.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

5 Session information


Version:      v1.0.1
Last update:  2021-03-11
Written by:   Sander W. van der Laan (s.w.vanderlaan-2[at]umcutrecht.nl).
Description:  Script to load single-cell RNA sequencing (scRNAseq) data, and perform quality control (QC), and initial mapping to cells.
Minimum requirements: R version 3.5.2 (2018-12-20) -- 'Eggshell Igloo', macOS Mojave (10.14.2).

Change log
* v1.0.1 Update to the gene list.
* v1.0.0 Initial version

sessionInfo()
R version 4.0.4 (2021-02-15)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Big Sur 10.16

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
 [1] stats4    parallel  grid      tools     stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] RColorBrewer_1.1-2                      SeuratObject_4.0.0                      Seurat_4.0.0                            EnhancedVolcano_1.8.0                   ggrepel_0.9.1                          
 [6] EnsDb.Hsapiens.v86_2.99.0               ensembldb_2.14.0                        AnnotationFilter_1.14.0                 TxDb.Hsapiens.UCSC.hg19.knownGene_3.2.2 mygene_1.26.0                          
[11] org.Hs.eg.db_3.12.0                     DESeq2_1.30.1                           SummarizedExperiment_1.20.0             MatrixGenerics_1.2.1                    matrixStats_0.58.0                     
[16] GenomicFeatures_1.42.1                  AnnotationDbi_1.52.0                    Biobase_2.50.0                          GenomicRanges_1.42.0                    GenomeInfoDb_1.26.2                    
[21] IRanges_2.24.1                          S4Vectors_0.28.1                        BiocGenerics_0.36.0                     corrr_0.4.3                             patchwork_1.1.0.9000                   
[26] reshape2_1.4.4                          bacon_1.18.0                            ellipse_0.4.2                           BiocParallel_1.24.1                     meta_4.18-0                            
[31] qqman_0.1.4                             tidylog_1.0.2                           gridExtra_2.3                           plyr_1.8.6                              labelled_2.7.0                         
[36] UpSetR_1.4.0                            ggpubr_0.4.0                            forestplot_1.10.1                       checkmate_2.0.0                         magrittr_2.0.1                         
[41] pheatmap_1.0.12                         devtools_2.3.2                          usethis_2.0.1                           BlandAltmanLeh_0.3.1                    tableone_0.12.0                        
[46] haven_2.3.1                             eeptools_1.2.4                          DT_0.17                                 knitr_1.31                              forcats_0.5.1                          
[51] stringr_1.4.0                           purrr_0.3.4                             tibble_3.1.0                            ggplot2_3.3.3                           tidyverse_1.3.0                        
[56] data.table_1.14.0                       naniar_0.6.0                            tidyr_1.1.3                             dplyr_1.0.5                             optparse_1.6.6                         
[61] readr_1.4.0                             openxlsx_4.2.3                         

loaded via a namespace (and not attached):
  [1] tinytex_0.30             clisymbols_1.2.0         mitools_2.4              pander_0.6.3             pbapply_1.4-3            lattice_0.20-41          vctrs_0.3.6              mgcv_1.8-34             
  [9] blob_1.2.1               survival_3.2-7           spatstat.data_2.0-0      later_1.1.0.1            nloptr_1.2.2.2           DBI_1.1.1                rappdirs_0.3.3           uwot_0.1.10             
 [17] gsubfn_0.7               jpeg_0.1-8.1             zlibbioc_1.36.0          sjmisc_2.8.6             htmlwidgets_1.5.3        mvtnorm_1.1-1            future_1.21.0            leiden_0.3.7            
 [25] irlba_2.3.3              Rcpp_1.0.6               KernSmooth_2.23-18       promises_1.2.0.1         DelayedArray_0.16.2      ggeffects_1.0.1          pkgload_1.2.0            Hmisc_4.5-0             
 [33] fs_1.5.0                 digest_0.6.27            png_0.1-7                sctransform_0.3.2        cowplot_1.1.1            pkgconfig_2.0.3          ggbeeswarm_0.6.0         estimability_1.3        
 [41] iterators_1.0.13         minqa_1.2.4              reticulate_1.18          beeswarm_0.2.3           xfun_0.21                bslib_0.2.4              zoo_1.8-8                tidyselect_1.1.0        
 [49] performance_0.7.0        ica_1.0-2                viridisLite_0.3.0        rtracklayer_1.50.0       pkgbuild_1.2.0           rlang_0.4.10             jquerylib_0.1.3          spatstat_1.64-1         
 [57] glue_1.4.2               modelr_0.1.8             emmeans_1.5.4            ggsignif_0.6.1           bayestestR_0.8.2         labeling_0.4.2           maptools_1.0-2           httpuv_1.5.5            
 [65] class_7.3-18             Rttf2pt1_1.3.8           TH.data_1.0-10           annotate_1.68.0          jsonlite_1.7.2           XVector_0.30.0           bit_4.0.4                mime_0.10               
 [73] Rsamtools_2.6.0          stringi_1.5.3            insight_0.13.1           processx_3.4.5           scattermore_0.7          survey_4.0               bitops_1.0-6             cli_2.3.1               
 [81] sqldf_0.4-11             maps_3.3.0               RSQLite_2.2.3            rstudioapi_0.13          GenomicAlignments_1.26.0 nlme_3.1-152             fastcluster_1.1.25       locfit_1.5-9.4          
 [89] listenv_0.8.0            miniUI_0.1.1.1           dbplyr_2.1.0             sessioninfo_1.1.1        readxl_1.3.1             lifecycle_1.0.0          munsell_0.5.0            cellranger_1.1.0        
 [97] ggsci_2.9                codetools_0.2-18         coda_0.19-4              vipor_0.4.5              lmtest_0.9-38            htmlTable_2.1.0          proto_1.0.0              xtable_1.8-4            
[105] ROCR_1.0-11              BiocManager_1.30.10      abind_1.4-5              farver_2.1.0             parallelly_1.23.0        RANN_2.6.1               askpass_1.1              visdat_0.5.3            
[113] CompQuadForm_1.4.3       sjstats_0.18.1           RcppAnnoy_0.0.18         goftest_1.2-2            cluster_2.1.1            future.apply_1.7.0       extrafontdb_1.0          Matrix_1.3-2            
[121] ellipsis_0.3.1           prettyunits_1.1.1        lubridate_1.7.10         ggridges_0.5.3           reprex_1.0.0             igraph_1.2.6             sjlabelled_1.1.7         remotes_2.2.0           
[129] parameters_0.12.0        testthat_3.0.2           spatstat.utils_2.0-0     getopt_1.20.3            htmltools_0.5.1.1        BiocFileCache_1.14.0     yaml_2.2.1               utf8_1.1.4              
[137] plotly_4.9.3             XML_3.99-0.5             e1071_1.7-4              foreign_0.8-81           withr_2.4.1              fitdistrplus_1.1-3       bit64_4.0.5              effectsize_0.4.3        
[145] multcomp_1.4-16          foreach_1.5.1            ProtGenerics_1.22.0      Biostrings_2.58.0        memoise_2.0.0            evaluate_0.14            rio_0.5.26               geneplotter_1.68.0      
[153] extrafont_0.17           callr_3.5.1              ps_1.6.0                 curl_4.3                 metafor_2.4-0            fansi_0.4.2              tensor_1.5               cachem_1.0.4            
[161] desc_1.3.0               deldir_0.2-10            proj4_1.0-10.1           rstatix_0.7.0            rprojroot_2.0.2          sass_0.3.1               sandwich_3.0-0           RCurl_1.98-1.2          
[169] car_3.0-10               xml2_1.3.2               httr_1.4.2               assertthat_0.2.1         rmarkdown_2.7            boot_1.3-27              globals_0.14.0           R6_2.5.0                
[177] nnet_7.3-15              progress_1.2.2           genefilter_1.72.1        statmod_1.4.35           sjPlot_2.8.7             ggrastr_0.2.3            splines_4.0.4            carData_3.0-4           
[185] colorspace_2.0-0         generics_0.1.0           base64enc_0.1-3          chron_2.3-56             pillar_1.5.1             ggalt_0.4.0              sp_1.4-5                 calibrate_1.7.7         
[193] GenomeInfoDbData_1.2.4   gtable_0.3.0             rvest_0.3.6              zip_2.1.1                latticeExtra_0.6-29      biomaRt_2.46.3           fastmap_1.1.0            crosstalk_1.1.1         
[201] doParallel_1.0.16        vcd_1.4-8                broom_0.7.5              openssl_1.4.3            scales_1.1.1             arm_1.11-2               backports_1.2.1          lme4_1.1-26             
[209] hms_1.0.0                Rtsne_0.15               shiny_1.6.0              ash_1.0-15               polyclip_1.10-0          lazyeval_0.2.2           dynamicTreeCut_1.63-1    Formula_1.2-4           
[217] crayon_1.4.1             MASS_7.3-53.1            rpart_4.1-15             compiler_4.0.4          

6 Saving environment

save.image(paste0(PROJECT_loc, "/",Today,".",PROJECTNAME,".scrnaseq_results.RData"))
© 1979-2021 Sander W. van der Laan | s.w.vanderlaan-2[at]umcutrecht.nl | swvanderlaan.github.io.
LS0tCnRpdGxlOiAiTWFwcGluZyBDQUMgc3VzY2VwdGliaWxpdHkgbG9jaSB3aXRoIHNpbmdsZS1jZWxsIHJlc29sdXRpb24gaW4gY2Fyb3RpZCBwbGFxdWVzLiIKYXV0aG9yOiAnW1NhbmRlciBXLiB2YW4gZGVyIExhYW4sIFBoRF0oaHR0cHM6Ly9zd3ZhbmRlcmxhYW4uZ2l0aHViLmlvKSB8IEBzd3ZhbmRlcmxhYW4nCmRhdGU6ICdgciBTeXMuRGF0ZSgpYCcKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogICAgY2FjaGU6IHllcwogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2xsYXBzZTogeWVzCiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZy5hbGlnbjogY2VudGVyCiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBmaWdfaGVpZ2h0OiAxMAogICAgZmlnX3JldGluYTogMgogICAgZmlnX3dpZHRoOiAxMgogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBwYXBlcgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBubwogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKbWFpbmZvbnQ6IEhlbHZldGljYQpzdWJ0aXRsZTogQSAnZHJ1Z2dhYmxlLU1JLXRhcmdldHMnIHByb2plY3QKZWRpdG9yX29wdGlvbnM6CiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CiMgZnVydGhlciBkZWZpbmUgc29tZSBrbml0ci1vcHRpb25zLgprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4LCBmaWcucGF0aCA9ICdGaWd1cmVzLycsCiAgICAgICAgICAgICAgICAgICAgICBldmFsID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCmBgYAoKX0NsZWFuIHRoZSBlbnZpcm9ubWVudC5fCmBgYHtyIENsZWFyRW52aXJvbm1lbnQsIGVjaG8gPSBGQUxTRX0Kcm0obGlzdCA9IGxzKCkpCmBgYAoKX1NldCBsb2NhdGlvbnMsIGFuZCB0aGUgd29ya2luZyBkaXJlY3RvcnkgLi4uXwpgYGB7ciBMb2NhbFN5c3RlbSwgZWNobyA9IEZBTFNFfQojIyMgT3BlcmF0aW5nIFN5c3RlbSBWZXJzaW9uCiMjIyBNYWMgUHJvCiMgUk9PVF9sb2MgPSAiL1ZvbHVtZXMvRWxpdGVQcm9ReDJNZWRpYSIKIyBHRU5PTUlDX2xvYyA9ICIvVXNlcnMvc3ZhbmRlcmxhYW4vaUNsb3VkL0dlbm9taWNzIgoKIyMjIE1hY0Jvb2sKUk9PVF9sb2MgPSAiL1VzZXJzL3NsYWFuMy9PbmVEcml2ZSAtIFVNQyBVdHJlY2h0IgpHRU5PTUlDX2xvYyA9IHBhc3RlMChST09UX2xvYywgIi9HZW5vbWljcyIpCgojIyMgR2VuZXJpYyBMb2NhdGlvbnMKQUVEQl9sb2MgPSBwYXN0ZTAoR0VOT01JQ19sb2MsICIvQUUtQUFBX0dTX0RCcyIpCkxBQl9sb2MgPSBwYXN0ZTAoR0VOT01JQ19sb2MsICIvTGFiQnVzaW5lc3MiKQoKUkFXREFUQSA9IHBhc3RlMChST09UX2xvYywgIi9QTElOSy9fQUVfT1JJR0lOQUxTL0FFU0NSTkEvcHJlcHBlZF9kYXRhIikKClJFU1VMVFMgPSBwYXN0ZTAoUk9PVF9sb2MsICIvUExJTksvYW5hbHlzZXMvbG9va3Vwcy9BRV8yMDIwMDUxMl9DT0xfTUtBVk9VU0lfTUJPU19DSEFSR0VfMTAwMEdfQ0FDL3NjUk5Bc2VxIikKUFJPSkVDVF9sb2MgPSBwYXN0ZTAoUk9PVF9sb2MsICIvUExJTksvYW5hbHlzZXMvbG9va3Vwcy9BRV8yMDIwMDUxMl9DT0xfTUtBVk9VU0lfTUJPU19DSEFSR0VfMTAwMEdfQ0FDL3NjUk5Bc2VxIikKClRBUkdFVF9sb2MgPSBwYXN0ZTAoR0VOT01JQ19sb2MsICIvQXRoZXJvLUV4cHJlc3MvRm9ybXMvMjAyMC9BRV8yMDIwMDUxMl9DT0xfTUtBVk9VU0lfTUJPU19DSEFSR0VfMTAwMEdfQ0FDIikKCiMjIyBTT01FIFZBUklBQkxFUyBXRSBORUVEIERPV04gVEhFIExJTkUKY2F0KCJcbkRlZmluaW5nIHBoZW5vdHlwZXMgYW5kIGRhdGFzZXRzLlxuIikKUFJPSkVDVE5BTUU9IkFFU0NSTkEiCgpjYXQoIlxuQ3JlYXRlIGEgbmV3IGFuYWx5c2lzIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHN1YmRpcmVjdG9yaWVzLlxuIikKIyBBbmFseXNpcwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKFBST0pFQ1RfbG9jLCAiLyIsUFJPSkVDVE5BTUUpKSwgCiAgICAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChQUk9KRUNUX2xvYywgIi8iLFBST0pFQ1ROQU1FKSksIAogICAgICAgRkFMU0UpCkFOQUxZU0lTX2xvYyA9IHBhc3RlMChQUk9KRUNUX2xvYywiLyIsUFJPSkVDVE5BTUUpCgojIFBsb3RzCmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoQU5BTFlTSVNfbG9jLCAiL1BMT1RTIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9QTE9UUyIpKSwgCiAgICAgICBGQUxTRSkKUExPVF9sb2MgPSBwYXN0ZTAoQU5BTFlTSVNfbG9jLCIvUExPVFMiKQoKIyBRQyBwbG90cwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKFBMT1RfbG9jLCAiL1FDIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKFBMT1RfbG9jLCAiL1FDIikpLCAKICAgICAgIEZBTFNFKQpRQ19sb2MgPSBwYXN0ZTAoUExPVF9sb2MsIi9RQyIpCgojIE91dHB1dCBmaWxlcwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9PVVRQVVQiKSksIAogICAgICAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoQU5BTFlTSVNfbG9jLCAiL09VVFBVVCIpKSwgCiAgICAgICBGQUxTRSkKT1VUX2xvYyA9IHBhc3RlMChBTkFMWVNJU19sb2MsICIvT1VUUFVUIikKCmNhdCgiXG5TZXR0aW5nIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBsaXN0aW5nIGl0cyBjb250ZW50cy5cbiIpCnNldHdkKHBhc3RlMChQUk9KRUNUX2xvYykpCmdldHdkKCkKbGlzdC5maWxlcygpCmBgYAoKXy4uLiBhIHBhY2thZ2UtaW5zdGFsbGF0aW9uIGZ1bmN0aW9uIC4uLl8KYGBge3IgRnVuY3Rpb246IGluc3RhbGxhdGlvbnMsIGVjaG89RkFMU0V9Cmluc3RhbGwucGFja2FnZXMuYXV0byA8LSBmdW5jdGlvbih4KSB7IAogIHggPC0gYXMuY2hhcmFjdGVyKHN1YnN0aXR1dGUoeCkpIAogIGlmKGlzVFJVRSh4ICVpbiUgLnBhY2thZ2VzKGFsbC5hdmFpbGFibGUgPSBUUlVFKSkpIHsgCiAgICBldmFsKHBhcnNlKHRleHQgPSBzcHJpbnRmKCJyZXF1aXJlKFwiJXNcIikiLCB4KSkpCiAgfSBlbHNlIHsgCiAgICAjIFVwZGF0ZSBpbnN0YWxsZWQgcGFja2FnZXMgLSB0aGlzIG1heSBtZWFuIGEgZnVsbCB1cGdyYWRlIG9mIFIsIHdoaWNoIGluIHR1cm4KICAgICMgbWF5IG5vdCBiZSB3YXJyZW50ZWQuIAogICAgIyB1cGRhdGUuaW5zdGFsbC5wYWNrYWdlcy5hdXRvKGFzayA9IEZBTFNFKSAKICAgIGV2YWwocGFyc2UodGV4dCA9IHNwcmludGYoImluc3RhbGwucGFja2FnZXMoXCIlc1wiLCBkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9IFwiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnL1wiKSIsIHgpKSkKICB9CiAgaWYoaXNUUlVFKHggJWluJSAucGFja2FnZXMoYWxsLmF2YWlsYWJsZSA9IFRSVUUpKSkgeyAKICAgIGV2YWwocGFyc2UodGV4dCA9IHNwcmludGYoInJlcXVpcmUoXCIlc1wiKSIsIHgpKSkKICB9IGVsc2UgewogICAgaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJCaW9jTWFuYWdlciIpKQogICAgICBpbnN0YWxsLnBhY2thZ2VzKCJCaW9jTWFuYWdlciIpCiAgICAjIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCkgIyB0aGlzIHdvdWxkIGVudGFpbCB1cGRhdGluZyBpbnN0YWxsZWQgcGFja2FnZXMsIHdoaWNoIGluIHR1cm5lZCBtYXkgbm90IGJlIHdhcnJlbnRlZAogICAgZXZhbChwYXJzZSh0ZXh0ID0gc3ByaW50ZigiQmlvY01hbmFnZXI6Omluc3RhbGwoXCIlc1wiKSIsIHgpKSkKICAgIGV2YWwocGFyc2UodGV4dCA9IHNwcmludGYoInJlcXVpcmUoXCIlc1wiKSIsIHgpKSkKICB9Cn0KYGBgCgpfLi4uIGFuZCBsb2FkIHRob3NlIHBhY2thZ2VzLl8KYGBge3IgU2V0dGluZzogbG9hZGluZ19wYWNrYWdlcywgZWNobz1GQUxTRX0KaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJyZWFkciIpCmluc3RhbGwucGFja2FnZXMuYXV0bygib3B0cGFyc2UiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInRvb2xzIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJkcGx5ciIpCmluc3RhbGwucGFja2FnZXMuYXV0bygidGlkeXIiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInRpZHlsb2ciKQpsaWJyYXJ5KCJ0aWR5bG9nIiwgd2Fybi5jb25mbGljdHMgPSBGQUxTRSkKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJuYW5pYXIiKQoKIyBUbyBnZXQgJ2RhdGEudGFibGUnIHdpdGggJ2Z3cml0ZScgdG8gYmUgYWJsZSB0byBkaXJlY3RseSB3cml0ZSBnemlwcGVkLWZpbGVzCiMgUmVmOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80Mjc4ODQwMS9pcy1wb3NzaWJsZS10by11c2UtZndyaXRlLWZyb20tZGF0YS10YWJsZS13aXRoLWd6ZmlsZQojIGluc3RhbGwucGFja2FnZXMoImRhdGEudGFibGUiLCByZXBvcyA9ICJodHRwczovL1JkYXRhdGFibGUuZ2l0bGFiLmlvL2RhdGEudGFibGUiKQpsaWJyYXJ5KGRhdGEudGFibGUpCgppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInRpZHl2ZXJzZSIpCmluc3RhbGwucGFja2FnZXMuYXV0bygia25pdHIiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIkRUIikKCmluc3RhbGwucGFja2FnZXMuYXV0bygib3JnLkhzLmVnLmRiIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJteWdlbmUiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIkVuaGFuY2VkVm9sY2FubyIpCgppbnN0YWxsLnBhY2thZ2VzLmF1dG8oImhhdmVuIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJ0YWJsZW9uZSIpCgojIGluc3RhbGwucGFja2FnZXMuYXV0bygiU2V1cmF0IikgIyBsYXRlc3QgdmVyc2lvbgoKIyBJbnN0YWxsIHRoZSBkZXZ0b29scyBwYWNrYWdlIGZyb20gSGFkbGV5IFdpY2toYW0KaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCdkZXZ0b29scycpCiMgUmVwbGFjZSAnMi4zLjQnIHdpdGggeW91ciBkZXNpcmVkIHZlcnNpb24KIyBkZXZ0b29sczo6aW5zdGFsbF92ZXJzaW9uKHBhY2thZ2UgPSAnU2V1cmF0JywgdmVyc2lvbiA9IHBhY2thZ2VfdmVyc2lvbignMi4zLjQnKSkKbGlicmFyeSgiU2V1cmF0IikKCgpgYGAKCl9XZSB3aWxsIGNyZWF0ZSBhIGRhdGVzdGFtcCBhbmQgZGVmaW5lIHRoZSBVdHJlY2h0IFNjaWVuY2UgUGFyayBDb2xvdXIgU2NoZW1lXy4KYGBge3IgU2V0dGluZzogQ29sb3JzLCBlY2hvPUZBTFNFfQoKVG9kYXkgPSBmb3JtYXQoYXMuRGF0ZShhcy5QT1NJWGx0KFN5cy50aW1lKCkpKSwgIiVZJW0lZCIpClRvZGF5LlJlcG9ydCA9IGZvcm1hdChhcy5EYXRlKGFzLlBPU0lYbHQoU3lzLnRpbWUoKSkpLCAiJUEsICVCICVkLCAlWSIpCgojIyMgVXRyZWNodFNjaWVuY2VQYXJrQ29sb3Vyc1NjaGVtZQojIyMKIyMjIFdlYnNpdGV0b2NvbnZlcnRIRVh0b1JHQjpodHRwOi8vaGV4LmNvbG9ycnJzLmNvbS4KIyMjIEZvcnNvbWVmdW5jdGlvbnN5b3VzaG91bGRkaXZpZGV0aGVzZW51bWJlcnNieTI1NS4KIyMjIAojIyMJTm8uCUNvbG9yCQkJICAgICAgSEVYCShSR0IpCQkJCQkJICAgICAgICAgICAgICBDSFIJCSAgTUFGL0lORk8KIyMjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIwkxCSAgeWVsbG93CQkJICAgICNGQkI4MjAgKDI1MSwxODQsMzIpCQkJCSAgICAgID0+CTEJCW9yIDEuMD5JTkZPCiMjIwkyCSAgZ29sZAkJCSAgICAgICNGNTlEMTAgKDI0NSwxNTcsMTYpCQkJCSAgICAgID0+CTIJCQojIyMJMwkgIHNhbG1vbgkJCSAgICAjRTU1NzM4ICgyMjksODcsNTYpCQkJCSAgICAgID0+CTMJCW9yIDAuMDU8TUFGPDAuMiBvciAwLjQ8SU5GTzwwLjYKIyMjCTQJICBkYXJrcGluawkJICAgICNEQjAwM0YgKCgyMTksMCw2MykJCQkJICAgICAgPT4JNAkJCiMjIwk1CSAgbGlnaHRwaW5rCQkgICAgI0UzNTQ5MyAoMjI3LDg0LDE0NykJCQkJICAgICAgPT4JNQkJb3IgMC44PElORk88MS4wCiMjIwk2CSAgcGluawkJCSAgICAgICNENTI2N0IgKDIxMywzOCwxMjMpCQkJCSAgICAgID0+CTYJCQojIyMJNwkgIGhhcmRwaW5rCQkgICAgI0NDMDA3MSAoMjA0LDAsMTEzKQkJCQkgICAgICA9Pgk3CQkKIyMjCTgJICBsaWdodHB1cnBsZQkgICAgI0E4NDQ4QSAoMTY4LDY4LDEzOCkJCQkJICAgICAgPT4JOAkJCiMjIwk5CSAgcHVycGxlCQkJICAgICM5QTM0ODAgKDE1NCw1MiwxMjgpCQkJCSAgICAgID0+CTkJCQojIyMJMTAJbGF2ZW5kZWwJCSAgICAjOEQ1QjlBICgxNDEsOTEsMTU0KQkJCQkgICAgICA9PgkxMAkJCiMjIwkxMQlibHVlcHVycGxlCQkgICM3MDUyOTYgKDExMiw4MiwxNTApCQkJCSAgICAgID0+CTExCQkKIyMjCTEyCXB1cnBsZWJsdWUJCSAgIzY4NkFBOSAoMTA0LDEwNiwxNjkpCQkJICAgICAgPT4JMTIJCQojIyMJMTMJbGlnaHRwdXJwbGVibHVlCSM2MTczQUQgKDk3LDExNSwxNzMvMTAxLDEyMCwxODApCT0+CTEzCQkKIyMjCTE0CXNlYWJsdWUJCQkgICAgIzRDODFCRiAoNzYsMTI5LDE5MSkJCQkJICAgICAgPT4JMTQJCQojIyMJMTUJc2t5Ymx1ZQkJCSAgICAjMkY4QkM5ICg0NywxMzksMjAxKQkJCQkgICAgICA9PgkxNQkJCiMjIwkxNglhenVyYmx1ZQkJICAgICMxMjkwRDkgKDE4LDE0NCwyMTcpCQkJCSAgICAgID0+CTE2CQlvciAwLjAxPE1BRjwwLjA1IG9yIDAuMjxJTkZPPDAuNAojIyMJMTcJbGlnaHRhenVyYmx1ZQkgICMxMzk2RDggKDE5LDE1MCwyMTYpCQkJCSAgICAgID0+CTE3CQkKIyMjCTE4CWdyZWVuYmx1ZQkJICAgICMxNUE2QzEgKDIxLDE2NiwxOTMpCQkJCSAgICAgID0+CTE4CQkKIyMjCTE5CXNlYXdlZWRncmVlbgkgICM1RUIxN0YgKDk0LDE3NywxMjcpCQkJCSAgICAgID0+CTE5CQkKIyMjCTIwCXllbGxvd2dyZWVuCQkgICM4NkI4MzMgKDEzNCwxODQsNTEpCQkJCSAgICAgID0+CTIwCQkKIyMjCTIxCWxpZ2h0bW9zc2dyZWVuCSNDNUQyMjAgKDE5NywyMTAsMzIpCQkJCSAgICAgID0+CTIxCQkKIyMjCTIyCW1vc3NncmVlbgkJICAgICM5RkMyMjggKDE1OSwxOTQsNDApCQkJCSAgICAgID0+CTIyCQlvciBNQUY+MC4yMCBvciAwLjY8SU5GTzwwLjgKIyMjCTIzCWxpZ2h0Z3JlZW4JICAJIzc4QjExMyAoMTIwLDE3NywxOSkJCQkJICAgICAgPT4JMjMvWAojIyMJMjQJZ3JlZW4JCQkgICAgICAjNDlBMDFEICg3MywxNjAsMjkpCQkJCSAgICAgID0+CTI0L1kKIyMjCTI1CWdyZXkJCQkgICAgICAjNTk1QTVDICg4OSw5MCw5MikJCQkJICAgICAgICA9PgkyNS9YWQlvciBNQUY8MC4wMSBvciAwLjA8SU5GTzwwLjIKIyMjCTI2CWxpZ2h0Z3JleQkJICAgICNBMkEzQTQJKDE2MiwxNjMsMTY0KQkJCSAgICAgID0+CTI2L01UCiMjIwojIyMJQURESVRJT05BTCBDT0xPUlMKIyMjCTI3CW1pZGdyZXkJCQkjRDdEOEQ3CiMjIwkyOAl2ZXJ5bGlnaHRncmV5CSNFQ0VDRUMiCiMjIwkyOQl3aGl0ZQkJCSNGRkZGRkYKIyMjCTMwCWJsYWNrCQkJIzAwMDAwMAojIyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp1aXRob2ZfY29sb3IgPSBjKCIjRkJCODIwIiwiI0Y1OUQxMCIsIiNFNTU3MzgiLCIjREIwMDNGIiwiI0UzNTQ5MyIsIiNENTI2N0IiLAogICAgICAgICAgICAgICAgICIjQ0MwMDcxIiwiI0E4NDQ4QSIsIiM5QTM0ODAiLCIjOEQ1QjlBIiwiIzcwNTI5NiIsIiM2ODZBQTkiLAogICAgICAgICAgICAgICAgICIjNjE3M0FEIiwiIzRDODFCRiIsIiMyRjhCQzkiLCIjMTI5MEQ5IiwiIzEzOTZEOCIsIiMxNUE2QzEiLAogICAgICAgICAgICAgICAgICIjNUVCMTdGIiwiIzg2QjgzMyIsIiNDNUQyMjAiLCIjOUZDMjI4IiwiIzc4QjExMyIsIiM0OUEwMUQiLAogICAgICAgICAgICAgICAgICIjNTk1QTVDIiwiI0EyQTNBNCIsICIjRDdEOEQ3IiwgIiNFQ0VDRUMiLCAiI0ZGRkZGRiIsICIjMDAwMDAwIikKCnVpdGhvZl9jb2xvcl9sZWdlbmQgPSBjKCIjRkJCODIwIiwgIiNGNTlEMTAiLCAiI0U1NTczOCIsICIjREIwMDNGIiwgIiNFMzU0OTMiLAogICAgICAgICAgICAgICAgICAgICAgICAiI0Q1MjY3QiIsICIjQ0MwMDcxIiwgIiNBODQ0OEEiLCAiIzlBMzQ4MCIsICIjOEQ1QjlBIiwKICAgICAgICAgICAgICAgICAgICAgICAgIiM3MDUyOTYiLCAiIzY4NkFBOSIsICIjNjE3M0FEIiwgIiM0QzgxQkYiLCAiIzJGOEJDOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICIjMTI5MEQ5IiwgIiMxMzk2RDgiLCAiIzE1QTZDMSIsICIjNUVCMTdGIiwgIiM4NkI4MzMiLAogICAgICAgICAgICAgICAgICAgICAgICAiI0M1RDIyMCIsICIjOUZDMjI4IiwgIiM3OEIxMTMiLCAiIzQ5QTAxRCIsICIjNTk1QTVDIiwKICAgICAgICAgICAgICAgICAgICAgICAgIiNBMkEzQTQiLCAiI0Q3RDhENyIsICIjRUNFQ0VDIiwgIiNGRkZGRkYiLCAiIzAwMDAwMCIpCgojZ2dwbG90MiBkZWZhdWx0IGNvbG9yIHBhbGV0dGUKZ2dfY29sb3JfaHVlIDwtIGZ1bmN0aW9uKG4pIHsKICBodWVzID0gc2VxKDE1LCAzNzUsIGxlbmd0aCA9IG4gKyAxKQogIGhjbChoID0gaHVlcywgbCA9IDY1LCBjID0gMTAwKVsxOm5dCn0KCiMjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmBgYAoKIyBFUkEtQ1ZEICdkcnVnZ2FibGUtTUktdGFyZ2V0cycKPCEtLSAhW0VSQS1DVkQgbG9nb10oIlVzZXJzL3N3dmFuZGVybGFhbi9pQ2xvdWQvR2Vub21pY3MvUHJvamVjdHMvI0RydWdnYWJsZS1NSS1HZW5lcy9BZG1pbmlzdHJhdGlvbi9FUkEtQ1ZEXCBMb2dvX0NNWUsuanBnIikgLS0+CgpGb3IgdGhlIEVSQS1DVkQgJ2RydWdnYWJsZS1NSS10YXJnZXRzJyBwcm9qZWN0IChncmFudG51bWJlcjogMDFLTDE4MDIpIHdlIHdpbGwgcGVyZm9ybSB0d28gcmVsYXRlZCBSTkEgc2VxdWVuY2luZyAoUk5Bc2VxKSBleHBlcmltZW50czoKCjEpIGNvbnZlbnRpb25hbCAoJ2J1bGsnKSBSTkFzZXEgdXNpbmcgUk5BIGV4dHJhY3RlZCBmcm9tIGNhcm90aWQgcGxhcXVlIHNhbXBsZXMsIG4gwrEgNzAwLiBBcyBvZiBgciBUb2RheS5SZXBvcnRgIGFsbCBzYW1wbGVzIGhhdmUgYmVlbiBzZWxlY3RlZCBhbmQgUk5BIGhhcyBiZWVuIGV4dHJhY3RlZDsgcXVhbGl0eSBjb250cm9sIChRQykgd2FzIHBlcmZvcm1lZCBhbmQgd2UgaGF2ZSBhIGRhdGFzZXQgb2YgNjM1IHNhbXBsZXMuCgoyKSBzaW5nbGUtY2VsbCBSTkFzZXEgKHNjUk5Bc2VxKSBvZiBhdCBsZWFzdCBuID0gNDAgc2FtcGxlcyAoMjAgZmVtYWxlcywgMjAgbWFsZXMpLiBBcyBvZiBgciBUb2RheS5SZXBvcnRgIGRhdGEgaXMgYXZhaWxhYmxlIG9mIDQwIHNhbXBsZXMgKDMgZmVtYWxlcywgMTUgbWFsZXMpLCB3ZSBhcmUgZXh0ZW5kaW5nIHNhbXBsaW5nIHRvIGdldCBtb3JlIGZlbWFsZSBzYW1wbGVzLgoKUGxhcXVlIHNhbXBsZXMgYXJlIGRlcml2ZWQgZnJvbSBjYXJvdGlkIGVuZGFydGVyZWN0b21pZXMgYXMgcGFydCBvZiB0aGUgW0F0aGVyby1FeHByZXNzIEJpb2JhbmsgU3R1ZHldKGh0dHA6d3d3L2F0aGVyb2V4cHJlc3MubmwpIHdoaWNoIGlzIGFuIG9uZ29pbmcgc3R1ZHkgaW4gdGhlIFVNQyBVdHJlY2h0LgoKCiMgQmFja2dyb3VuZAoKSGVyZSB3ZSBtYXAgdGhlIENIQVJHRSBDb25zb3J0aXVtIDEwMDBHIEdXQVMgb24gX2Nvcm9uYXJ5IGFydGVyeSBjYWxjaWZpY2F0aW9uIChDQUMpXyBzdXNjZXB0aWJpbGl0eSBsb2NpIHRvIHRoZSBzaW5nbGUtY2VsbCBjYXJvdGlkIHBsYXF1ZSBkYXRhLiBUaGVzZSBhcmUgZ2l2ZW4gaW46CgotIGBJbmRTaWdTTlBzZm9yU2FuZGVyLnhsc3hgCi0gYEdlbmVMaXN0XzE1MDQyMDIwLnhsc3hgCgpgYGB7ciBDQUMgdGFyZ2V0c30KbGlicmFyeShvcGVueGxzeCkKCkNBQ19nZW5lX2xpc3QgPC0gcmVhZC54bHN4KHBhc3RlMChUQVJHRVRfbG9jLCAiL0dlbmVMaXN0XzE1MDQyMDIwLnhsc3giKSkKCkNBQ192YXJpYW50cyA8LSByZWFkLnhsc3gocGFzdGUwKFRBUkdFVF9sb2MsICIvSW5kU2lnU05Qc2ZvclNhbmRlci54bHN4IikpCgoKRFQ6OmRhdGF0YWJsZShDQUNfZ2VuZV9saXN0KQoKRFQ6OmRhdGF0YWJsZShDQUNfdmFyaWFudHMpCgpgYGAKCldlIHdpbGwgY29uc3RydWN0IGEgbGlzdCBvZiBnZW5lcyB0byBtYXAgdG8gb3VyIHNjUk5Bc2VxIGRhdGEuIAoKYGBge3IgQ0FDIHRhcmdldHMgZm9yIG1hcHBpbmd9Cgp0YXJnZXRfZ2VuZXMgPC0gdW5saXN0KENBQ19nZW5lX2xpc3Qkc3ltYm9sKQp0YXJnZXRfZ2VuZXMKYGBgCgoKIyBMb2FkIGRhdGEKRmlyc3Qgd2Ugd2lsbCBsb2FkIHRoZSBkYXRhOgoKLSBzY1JOQXNlcSBleHBlcmltZW50YWwgZGF0YSBhbmQgcmVuYW1lIHRoZSBjZWxsIHR5cGVzLgotIEF0aGVyby1FeHByZXNzIGNsaW5pY2FsIGRhdGEuCgojIyBBRVNDUk5BOiBzaW5nbGUtY2VsbCBSTkFzZXEgZnJvbSBjYXJvdGlkIHBsYXF1ZXMKCkhlcmUgd2UgbG9hZCB0aGUgbGF0ZXN0IGRhdGFzZXQgZnJvbSBvdXIgQXRoZXJvLUV4cHJlc3MgU2luZ2xlIENlbGwgUk5BIGV4cGVyaW1lbnQuCgpgYGB7ciBMb2FkRGF0YX0KCnNjUk5Bc2VxRGF0YSA8LSByZWFkUkRTKHBhc3RlMChSQVdEQVRBLCAiL1NldXNldF80MF9wYXRpZW50cy9TZXVzZXRfNDBfcGF0aWVudHMuUkRTIikpCnNjUk5Bc2VxRGF0YQoKYGBgCgpUaGUgbmFtaW5nL2NsYXNzaWZpY2F0aW9uIGlzIGJhc2VkIG9uIGEgY29tYmluYXRpb24gY29udmVudGlvbmFsIG1hcmtlcnMuIFdlIGRvIG5vdCBjbGFpbSB0byBrbm93IHRoZSBleGFjdCBpZGVudGl0eSBvZiBlYWNoIGNlbGwsIHJhdGhlciB3ZSByZWZlciB0byBjZWxscyBhcyAnS0lUKyBNYXN0IGNlbGxzIi1saWtlIGNlbGxzLiBMaWtld2lzZSB3ZSByZWZlciB0byB0aGUgY2VsbCBjbHVzdGVycyBhcyAnY29tbXVuaXRpZXMnIG9mIGNlbGxzIHRoYXQgZXhpaGliaXQgc2ltaWxhciBwcm9wZXJ0aWVzLCBfaS5lLl8gc2ltaWxhciBkZWZpbmluZyBtYXJrZXJzIChfZS5nLiBLSVRfKS4gCgpXZSB3aWxsIHJlbmFtZSB0aGUgY2VsbCB0eXBlcyB0byBodW1hbiByZWFkYWJsZSBuYW1lcy4gCmBgYHtyIENoYW5nZSBjZWxsIGN1bW11bml0eSBuYW1lc30KIyMjIGNoYW5nZSBuYW1lcyBmb3IgY2xhcml0eQpiYWNrdXAuc2NSTkFzZXFEYXRhID0gc2NSTkFzZXFEYXRhCiMgZ2V0IHRoZSBvbGQgbmFtZXMgdG8gY2hhbmdlIHRvIG5ldyBuYW1lcwpVTUFQUGxvdChzY1JOQXNlcURhdGEsIGxhYmVsID0gRkFMU0UsIHB0LnNpemUgPSAxLjI1LCBsYWJlbC5zaXplID0gNCwgZ3JvdXAuYnkgPSAiaWRlbnQiKQoKdW5pcXVlKHNjUk5Bc2VxRGF0YUBhY3RpdmUuaWRlbnQpCgpjZWxsdHlwZXMgPC0gYygiQ0QxNCtDRDY4KyBNYWNyb3BoYWdlcyBJIiA9ICJDRDE0K0NENjgrIE0gSSIsIAogICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNYWNyb3BoYWdlcyBJSSIgPSAiQ0QxNCtDRDY4KyBNIElJIiwgCiAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE1hY3JvcGhhZ2VzIElJSSIgPSAiQ0QxNCtDRDY4KyBNIElJSSIsCiAgICAgICAgICAgICAgICJDRDMrQ0Q4KyBUIGNlbGxzIEkiID0gIkNEMytDRDgrIFQgSSIsCiAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBDZWxscyBJSSIgPSAiQ0QzK0NEOEErIFQgSUkgIiwgCiAgICAgICAgICAgICAgICJDRDMrQ0Q4IFQgY2VsbHMgSUlJIiA9ICJDRDMrQ0Q4IFQgSUlJIiwgCiAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIENlbGxzIEkiID0gIkNEMytDRDQrIFQgSSIsIAogICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBDZWxscyBJSSIgPSAiQ0QzK0NENCsgVCBJSSIsIAogICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBDZWxscyBJSUkiID0gIkNEMytDRDQrIFQgSUlJIiwgCiAgICAgICAgICAgICAgICJDRDM0KyBFbmRvdGhlbGlhbCBDZWxscyBJIiA9ICJDRDM0KyBFQyBJIiwgCiAgICAgICAgICAgICAgICJDRDM0KyBFbmRvdGhlbGlhbCBDZWxscyBJSSIgPSAiQ0QzNCsgRUMgSUkiLCAKICAgICAgICAgICAgICAgIk1peGVkIENlbGxzIEkiID0gIk1peGVkIEkiLCAKICAgICAgICAgICAgICAgIk1peGVkIENlbGxzIElJIiA9ICJNaXhlZCBJSSIsIAogICAgICAgICAgICAgICAiQUNUQTIrIFNtb290aCBNdXNjbGUgQ2VsbHMiID0gIkFDVEEyKyBTTUMiLCAKICAgICAgICAgICAgICAgIk5DQU0xKyBOYXR1cmFsIEtpbGxlciBDZWxscyIgPSAiTkNBTTErIE5LIiwgCiAgICAgICAgICAgICAgICJLSVQrIE1hc3QgQ2VsbHMiID0gIktJVCsgTUMiLAogICAgICAgICAgICAgICAiQ0Q3OUErIEIgQ2VsbHMgSSIgPSAiQ0Q3OUErIEIgSSIsIAogICAgICAgICAgICAgICAiQ0Q3OUErIEIgQ2VsbHMgSUkiID0gIkNENzlBKyBCIElJIikKCnNjUk5Bc2VxRGF0YSA8LSBTZXVyYXQ6OlJlbmFtZUlkZW50cyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsdHlwZXMpCmBgYAoKYGBge3IgQ2hhbmdlIGNlbGwgY3VtbXVuaXR5IG5hbWVzIC0gbmV3IHBsb3R9ClVNQVBQbG90KHNjUk5Bc2VxRGF0YSwgbGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMS4yNSwgbGFiZWwuc2l6ZSA9IDQsIGdyb3VwLmJ5ID0gImlkZW50IiwKICAgICAgICAgcmVwZWwgPSBUUlVFKQoKYGBgCgojIyBBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5OiBjbGluaWNhbCBkYXRhCgpMb2FkaW5nIEF0aGVyby1FeHByZXNzIGNsaW5pY2FsIGRhdGEuCmBgYHtyIExvYWRBRURCfQpyZXF1aXJlKGhhdmVuKQoKIyBBRURCIDwtIGhhdmVuOjpyZWFkX3NhdihwYXN0ZTAoQUVEQl9sb2MsICIvMjAxOS0zTkVXX0F0aGVyb0V4cHJlc3NEYXRhYmFzZV9TY2llbnRpZmljQUVfMDIwNzIwMTlfSUNfYWRkZWQuc2F2IikpCkFFREIgPC0gaGF2ZW46OnJlYWRfc2F2KHBhc3RlMChBRURCX2xvYywgIi8yMDIwXzFfTkVXX0F0aGVyb0V4cHJlc3NEYXRhYmFzZV9TY2llbnRpZmljQUVfMTYtMDMtMjAyMC5zYXYiKSkKCmBgYAoKIyMjIEZpeCBjbGluaWNhbCBkYXRhCgpXZSBuZWVkIHRvIGJlIHZlcnkgc3RyaWN0IGluIGRlZmluaW5nIF9zeW1wdG9tcy5fIFRoZXJlZm9yZSB3ZSB3aWxsIGZpeCBhIG5ldyB2YXJpYWJsZSB0aGF0IGdyb3VwcyBfc3ltcHRvbXNfIGF0IGluY2x1c2lvbi4KCkNvZGluZyBvZiBfc3ltcHRvbXNfIGlzIGFzIGZvbGxvd3M6CgotIG1pc3NpbmcJLTk5OQkKLSBBc3ltcHRvbWF0aWMJMAkKLSBUSUEJMQkKLSBtaW5vciBzdHJva2UJMgkKLSBNYWpvciBzdHJva2UJMwkKLSBBbWF1cm9zaXMgZnVnYXgJNAkKLSBGb3VyIHZlc3NlbCBkaXNlYXNlCTUJCi0gVmVydGVicm9iYXNpbGFyeSBUSUEJNwkKLSBSZXRpbmFsIGluZmFyY3Rpb24JOAkKLSBTeW1wdG9tYXRpYywgYnV0IGFzcGVjaWZpYyBzeW10b21zCTkKLSBDb250cmFsYXRlcmFsIHN5bXB0b21hdGljIG9jY2x1c2lvbgkxMAkKLSByZXRpbmFsIGluZmFyY3Rpb24JMTEJCi0gYXJtY2xhdWRpY2F0aW9uIGR1ZSB0byBvY2NsdXNpb24gc3ViY2xhdmlhbiBhcnRlcnksIENFQSBuZWVkZWQgZm9yIGJ5cGFzcwkxMgkKLSByZXRpbmFsIGluZmFyY3Rpb24gKyBUSUFzCTEzCQotIE9jdWxhciBpc2NoZW1pYyBzeW5kcm9tZQkxNAkKLSBpc2NoZW1pc2NoIGdsYXVjb29tCTE1CQotIHN1YmNsYXZpYW4gc3RlYWwgc3luZHJvbWUJMTYJCi0gVEdBCTE3CgpXZSB3aWxsIGdyb3VwIGFzIGZvbGxvd3M6CgoxLiBBc3ltcHRvbWF0aWMgPiAwCjIuIFRJQSA+IDEsIDcsIDEzCjMuIFN0cm9rZSA+IDIsIDMKNC4gT2N1bGFyID4gNCwgMTQsIDE1CjUuIFJldGluYWwgaW5mYXJjdGlvbiA+IDgsIDExCjYuIE90aGVyID4gNSwgOSwgMTAsIDEyLCAxNiwgMTcKCgpgYGB7ciBGaXhTeW1wdG9tcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMgRml4IHN5bXB0b21zCgphdHRhY2goQUVEQikKQUVEQlssIlN5bXB0b21zLjVHIl0gPC0gTkEKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSAwXSA8LSAiQXN5bXB0b21hdGljIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDEgfCBzeW1wdCA9PSA3IHwgc3ltcHQgPT0gMTNdIDwtICJUSUEiCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gMiB8IHN5bXB0ID09IDNdIDwtICJTdHJva2UiCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gNCB8IHN5bXB0ID09IDE0IHwgc3ltcHQgPT0gMTUgXSA8LSAiT2N1bGFyIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDggfCBzeW1wdCA9PSAxMV0gPC0gIlJldGluYWwgaW5mYXJjdGlvbiIKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSA1IHwgc3ltcHQgPT0gOSB8IHN5bXB0ID09IDEwIHwgc3ltcHQgPT0gMTIgfCBzeW1wdCA9PSAxNiB8IHN5bXB0ID09IDE3XSA8LSAiT3RoZXIiCgoKIyBBc3ltcHRTeW1wdApBRURCWywiQXN5bXB0U3ltcHQiXSA8LSBOQQpBRURCJEFzeW1wdFN5bXB0W3N5bXB0ID09IC05OTldIDwtIE5BCkFFREIkQXN5bXB0U3ltcHRbc3ltcHQgPT0gMF0gPC0gIkFzeW1wdG9tYXRpYyIKQUVEQiRBc3ltcHRTeW1wdFtzeW1wdCA9PSAxIHwgc3ltcHQgPT0gNyB8IHN5bXB0ID09IDEzIHwgc3ltcHQgPT0gMiB8IHN5bXB0ID09IDNdIDwtICJTeW1wdG9tYXRpYyIKQUVEQiRBc3ltcHRTeW1wdFtzeW1wdCA9PSA0IHwgc3ltcHQgPT0gMTQgfCBzeW1wdCA9PSAxNSB8IHN5bXB0ID09IDggfCBzeW1wdCA9PSAxMSB8IHN5bXB0ID09IDUgfCBzeW1wdCA9PSA5IHwgc3ltcHQgPT0gMTAgfCBzeW1wdCA9PSAxMiB8IHN5bXB0ID09IDE2IHwgc3ltcHQgPT0gMTddIDwtICJPY3VsYXIgYW5kIG90aGVycyIKCiMgQXN5bXB0U3ltcHQKQUVEQlssIkFzeW1wdFN5bXB0MkciXSA8LSBOQQpBRURCJEFzeW1wdFN5bXB0Mkdbc3ltcHQgPT0gLTk5OV0gPC0gTkEKQUVEQiRBc3ltcHRTeW1wdDJHW3N5bXB0ID09IDBdIDwtICJBc3ltcHRvbWF0aWMiCkFFREIkQXN5bXB0U3ltcHQyR1tzeW1wdCA9PSAxIHwgc3ltcHQgPT0gNyB8IHN5bXB0ID09IDEzIHwgc3ltcHQgPT0gMiB8IHN5bXB0ID09IDMgfCBzeW1wdCA9PSA0IHwgc3ltcHQgPT0gMTQgfCBzeW1wdCA9PSAxNSB8IHN5bXB0ID09IDggfCBzeW1wdCA9PSAxMSB8IHN5bXB0ID09IDUgfCBzeW1wdCA9PSA5IHwgc3ltcHQgPT0gMTAgfCBzeW1wdCA9PSAxMiB8IHN5bXB0ID09IDE2IHwgc3ltcHQgPT0gMTddIDwtICJTeW1wdG9tYXRpYyIKCmRldGFjaChBRURCKQoKIyB0YWJsZShBRURCJHN5bXB0LCB1c2VOQSA9ICJpZmFueSIpCiMgdGFibGUoQUVEQiRBc3ltcHRTeW1wdDJHLCB1c2VOQSA9ICJpZmFueSIpCiMgdGFibGUoQUVEQiRTeW1wdG9tcy41RywgdXNlTkEgPSAiaWZhbnkiKQojIAojIHRhYmxlKEFFREIkQXN5bXB0U3ltcHQyRywgQUVEQiRzeW1wdCwgdXNlTkEgPSAiaWZhbnkiKQojIHRhYmxlKEFFREIkU3ltcHRvbXMuNUcsIEFFREIkc3ltcHQsIHVzZU5BID0gImlmYW55IikKdGFibGUoQUVEQiRBc3ltcHRTeW1wdDJHLCBBRURCJFN5bXB0b21zLjVHLCB1c2VOQSA9ICJpZmFueSIpCgojIEFFREIudGVtcCA8LSBzdWJzZXQoQUVEQiwgIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJVUElEIiwgIkFnZSIsICJHZW5kZXIiLCAiSG9zcGl0YWwiLCAiQXJ0ZXJ5X3N1bW1hcnkiLCAic3ltcHQiLCAiU3ltcHRvbXMuNUciLCAiQXN5bXB0U3ltcHQiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyB0YWJsZShBRURCLnRlbXAkU3ltcHRvbXMuNUcsIEFFREIudGVtcCRBc3ltcHRTeW1wdCkKIyAKIyBybShBRURCLnRlbXApCmBgYAoKV2Ugd2lsbCBhbHNvIGZpeCB0aGUgX3BsYXF1ZXBoZW5vdHlwZXNfIHZhcmlhYmxlLiAgCgpDb2Rpbmcgb2Ygc3ltcHRvbXMgaXMgYXMgZm9sbG93czoKCi0gbWlzc2luZwktOTk5CQotIG5vdCByZWxldmFudCAtODg4Ci0gZmlicm91cwkxCQotIGZpYnJvYXRoZXJvbWF0b3VzCTIJCi0gYXRoZXJvbWF0b3VzCTMJCgoKYGBge3IgRml4UGxhcXVlUGhlbm90eXBlcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMgRml4IHBsYXF1ZXBoZW5vdHlwZXMKYXR0YWNoKEFFREIpCkFFREJbLCJPdmVyYWxsUGxhcXVlUGhlbm90eXBlIl0gPC0gTkEKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlW3BsYXF1ZXBoZW5vdHlwZSA9PSAtOTk5XSA8LSBOQQpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGVbcGxhcXVlcGhlbm90eXBlID09IC05OTldIDwtIE5BCkFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZVtwbGFxdWVwaGVub3R5cGUgPT0gMV0gPC0gImZpYnJvdXMiCkFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZVtwbGFxdWVwaGVub3R5cGUgPT0gMl0gPC0gImZpYnJvYXRoZXJvbWF0b3VzIgpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGVbcGxhcXVlcGhlbm90eXBlID09IDNdIDwtICJhdGhlcm9tYXRvdXMiCmRldGFjaChBRURCKQoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgInBsYXF1ZXBoZW5vdHlwZSIsICJPdmVyYWxsUGxhcXVlUGhlbm90eXBlIikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIAojIERUOjpkYXRhdGFibGUoQUVEQi50ZW1wWzE6MTAsXSwgY2FwdGlvbiA9ICJFeGNlcnB0IG9mIHRoZSB3aG9sZSBBRURCLiIsIHJvd25hbWVzID0gRkFMU0UpCiMgCiMgcm0oQUVEQi50ZW1wKQoKYGBgCgpXZSB3aWxsIGFsc28gZml4IHRoZSBfZGlhYmV0ZXNfIHN0YXR1cyB2YXJpYWJsZS4KCmBgYHtyIEZpeERpYWJldGVzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyBGaXggZGlhYmV0ZXMKYXR0YWNoKEFFREIpCkFFREJbLCJEaWFiZXRlc1N0YXR1cyJdIDwtIE5BCkFFREIkRGlhYmV0ZXNTdGF0dXNbRE0uY29tcG9zaXRlID09IC05OTldIDwtIE5BCkFFREIkRGlhYmV0ZXNTdGF0dXNbRE0uY29tcG9zaXRlID09IDBdIDwtICJDb250cm9sIChubyBEaWFiZXRlcyBEeC9NZWQpIgpBRURCJERpYWJldGVzU3RhdHVzW0RNLmNvbXBvc2l0ZSA9PSAxXSA8LSAiRGlhYmV0ZXMiCmRldGFjaChBRURCKQoKdGFibGUoQUVEQiRETS5jb21wb3NpdGUsIEFFREIkRGlhYmV0ZXNTdGF0dXMpCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJETS5jb21wb3NpdGUiLCAiRGlhYmV0ZXNTdGF0dXMiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgQUVEQi50ZW1wJERpYWJldGVzU3RhdHVzIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkRGlhYmV0ZXNTdGF0dXMpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgpgYGAKCgpXZSB3aWxsIGFsc28gZml4IHRoZSBfc21va2luZ18gc3RhdHVzIHZhcmlhYmxlLiBXZSBhcmUgaW50ZXJlc3RlZCBpbiB3aGV0aGVyIHNvbWVvbmUgbmV2ZXIsIGV2ZXIgb3IgaXMgY3VycmVudGx5IChhdCB0aGUgdGltZSBvZiBpbmNsdXNpb24pIHNtb2tpbmcuIFRoaXMgaXMgYmFzZWQgb24gdGhlIHF1ZXN0aW9ubmFpcmUuIAoKLSBgZGlldDgwMWA6IGFyZSB5b3UgYSBzbW9rZXI/Ci0gYGRpZXQ4MDJgOiBkaWQgeW91IHNtb2tlIGluIHRoZSBwYXN0PwoKV2UgYWxyZWFkeSBoYXZlIHNvbWUgdmFyaWFibGVzIGluZGljYXRpbmcgc21va2luZyBzdGF0dXM6CgotIGBTbW9raW5nUmVwb3J0ZWRgOiBwYXRpZW50IGhhcyByZXBvcnRlZCB0byBzbW9rZS4KLSBgU21va2luZ1llYXJPUmA6IHNtb2tpbmcgaW4gdGhlIHllYXIgb2Ygc3VyZ2VyeT8KLSBgU21va2VyQ3VycmVudGA6IGN1cnJlbnRseSBzbW9raW5nPwoKCgpgYGB7ciBGaXhTbW9raW5nLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpyZXF1aXJlKGxhYmVsbGVkKQpBRURCJGRpZXQ4MDEgPC0gdG9fZmFjdG9yKEFFREIkZGlldDgwMSkKQUVEQiRkaWV0ODAyIDwtIHRvX2ZhY3RvcihBRURCJGRpZXQ4MDIpCkFFREIkZGlldDgwNSA8LSB0b19mYWN0b3IoQUVEQiRkaWV0ODA1KQpBRURCJFNtb2tpbmdSZXBvcnRlZCA8LSB0b19mYWN0b3IoQUVEQiRTbW9raW5nUmVwb3J0ZWQpCkFFREIkU21va2VyQ3VycmVudCA8LSB0b19mYWN0b3IoQUVEQiRTbW9rZXJDdXJyZW50KQpBRURCJFNtb2tpbmdZZWFyT1IgPC0gdG9fZmFjdG9yKEFFREIkU21va2luZ1llYXJPUikKCiMgdGFibGUoQUVEQiRkaWV0ODAxKQojIHRhYmxlKEFFREIkZGlldDgwMikKIyB0YWJsZShBRURCJFNtb2tpbmdSZXBvcnRlZCkKIyB0YWJsZShBRURCJFNtb2tlckN1cnJlbnQpCiMgdGFibGUoQUVEQiRTbW9raW5nWWVhck9SKQojIHRhYmxlKEFFREIkU21va2luZ1JlcG9ydGVkLCBBRURCJFNtb2tlckN1cnJlbnQsIHVzZU5BID0gImlmYW55IiwgZG5uID0gYygiUmVwb3J0ZWQgc21va2luZyIsICJDdXJyZW50IHNtb2tlciIpKQojIAojIHRhYmxlKEFFREIkZGlldDgwMSwgQUVEQiRkaWV0ODAyLCB1c2VOQSA9ICJpZmFueSIsIGRubiA9IGMoIlNtb2tlciIsICJQYXN0IHNtb2tlciIpKQoKY2F0KCJcbkZpeGluZyBzbW9raW5nIHN0YXR1cy5cbiIpCmF0dGFjaChBRURCKQpBRURCWywiU21va2VyU3RhdHVzIl0gPC0gTkEKQUVEQiRTbW9rZXJTdGF0dXNbZGlldDgwMiA9PSAiZG9uJ3Qga25vdyJdIDwtICJOZXZlciBzbW9rZWQiCkFFREIkU21va2VyU3RhdHVzW2RpZXQ4MDIgPT0gIkkgc3RpbGwgc21va2UiXSA8LSAiQ3VycmVudCBzbW9rZXIiCkFFREIkU21va2VyU3RhdHVzW1Ntb2tlckN1cnJlbnQgPT0gIm5vIiAmIGRpZXQ4MDIgPT0gIm5vIl0gPC0gIk5ldmVyIHNtb2tlZCIKQUVEQiRTbW9rZXJTdGF0dXNbU21va2VyQ3VycmVudCA9PSAibm8iICYgZGlldDgwMiA9PSAieWVzIl0gPC0gIkV4LXNtb2tlciIKQUVEQiRTbW9rZXJTdGF0dXNbU21va2VyQ3VycmVudCA9PSAieWVzIl0gPC0gIkN1cnJlbnQgc21va2VyIgpBRURCJFNtb2tlclN0YXR1c1tTbW9rZXJDdXJyZW50ID09ICJubyBkYXRhIGF2YWlsYWJsZS9taXNzaW5nIl0gPC0gTkEKIyBBRURCJFNtb2tlclN0YXR1c1tpcy5uYShTbW9rZXJDdXJyZW50KV0gPC0gIk5ldmVyIHNtb2tlZCIKZGV0YWNoKEFFREIpCgpjYXQoIlxuKiBDdXJyZW50IHNtb2tpbmcgc3RhdHVzLlxuIikKdGFibGUoQUVEQiRTbW9rZXJDdXJyZW50LAogICAgICB1c2VOQSA9ICJpZmFueSIsIAogICAgICBkbm4gPSBjKCJDdXJyZW50IHNtb2tlciIpKQoKY2F0KCJcbiogVXBkYXRlZCBzbW9raW5nIHN0YXR1cy5cbiIpCnRhYmxlKEFFREIkU21va2VyU3RhdHVzLAogICAgICB1c2VOQSA9ICJpZmFueSIsIAogICAgICBkbm4gPSBjKCJVcGRhdGVkIHNtb2tpbmcgc3RhdHVzIikpCgpjYXQoIlxuKiBDb21wYXJpbmcgdG8gJ1Ntb2tlckN1cnJlbnQnLlxuIikKdGFibGUoQUVEQiRTbW9rZXJTdGF0dXMsIEFFREIkU21va2VyQ3VycmVudCwgCiAgICAgIHVzZU5BID0gImlmYW55IiwgCiAgICAgIGRubiA9IGMoIlVwZGF0ZWQgc21va2luZyBzdGF0dXMiLCAiQ3VycmVudCBzbW9rZXIiKSkKCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJETS5jb21wb3NpdGUiLCAiRGlhYmV0ZXNTdGF0dXMiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgQUVEQi50ZW1wJERpYWJldGVzU3RhdHVzIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkRGlhYmV0ZXNTdGF0dXMpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgoKYGBgCgpXZSB3aWxsIGFsc28gZml4IHRoZSBfYWxjb2hvbF8gc3RhdHVzIHZhcmlhYmxlLgoKCmBgYHtyIEZpeEFsY29ob2wsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojIEZpeCBkaWFiZXRlcwphdHRhY2goQUVEQikKQUVEQlssIkFsY29ob2xVc2UiXSA8LSBOQQpBRURCJEFsY29ob2xVc2VbZGlldDgxMCA9PSAtOTk5XSA8LSBOQQpBRURCJEFsY29ob2xVc2VbZGlldDgxMCA9PSAwXSA8LSAiTm8iCkFFREIkQWxjb2hvbFVzZVtkaWV0ODEwID09IDFdIDwtICJZZXMiCmRldGFjaChBRURCKQoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgImRpZXQ4MTAiLCAiQWxjb2hvbFVzZSIpKQojIHJlcXVpcmUobGFiZWxsZWQpCiMgQUVEQi50ZW1wJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEdlbmRlcikKIyBBRURCLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRIb3NwaXRhbCkKIyBBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSkKIyBBRURCLnRlbXAkQWxjb2hvbFVzZSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFsY29ob2xVc2UpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgoKYGBgCgoKIyMjIFByZXBhcmUgYmFzZWxpbmUgY2hhcmFjdGVyaXN0aWNzCgpXZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhdCBiYXNlbGluZS4KCi0gQWdlICh5ZWFycykKLSBGZW1hbGUgc2V4IChOLCAlKQotIEh5cGVydGVuc2lvbiAoTiwgJSkKLSBTQlAgKG1tSGcpCi0gREJQIChtbUhnKQotIERpYWJldGVzIG1lbGxpdHVzIChOLCAlKQotIFRvdGFsIGNob2xlc3Rlcm9sIGxldmVscyAobWcvZEwpCi0gTERMIGNob2xlc3Rlcm9sIGxldmVscyAobWcvZEwpCi0gSERMIGNob2xlc3Rlcm9sIGxldmVscyAobWcvZEwpCi0gVHJpZ2x5Y2VyaWRlIGxldmVscyAobWcvZEwpCi0gVXNlIG9mIHN0YXRpbnMgKE4sICUpCi0gVXNlIG9mIGFudGlwbGF0ZWxldCBkcnVncyAoTiwgJSkKLSBCTUkgKGtnL23CsikKLSBTbW9raW5nIHN0YXR1cyAoTiwgJSkKICAtIE5ldmVyIHNtb2tlcnMKICAtIEV4LXNtb2tlcnMKICAtIEN1cnJlbnQgc21va2VycwotIEhpc3Rvcnkgb2YgQ0FEIChOLCAlKQotIEhpc3Rvcnkgb2YgUEFEIChOLCAlKQotIENsaW5pY2FsIG1hbmlmZXN0YXRpb25zCiAgLSBBc3ltcHRvbWF0aWMKICAtIEFtYXVyb3NpcyBmdWdheAogIC0gVElBCiAgLSBTdHJva2UKLSBlR0ZSIChtTC9taW4vMS43MyBtwrIpCi0gVGVzdG9zdGVyb25lIChubW9sL0wpCgpgYGB7ciBCYXNlbGluZSBBRURCOiBwcmVwYXJhdGlvbn0KY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKQpjYXQoIlNFTEVDVElPTiBUSEUgU0hJWlpMRVxuIikKCiMjIyBBcnRlcnkgbGV2ZWxzCiMgQUVkYXRhJEFydGVyeV9zdW1tYXJ5OiAKIyAgICAgICAgICAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsCiMgTk9UIFVTRSAtIDAgTm8gYXJ0ZXJ5IGtub3duICh5ZXQpLCBubyBzdXJnZXJ5IChwYXRpZW50IGlsbCwgZGllZCwgZXhpdGVkIHN0dWR5KSwgcmUtbnVtYmVyZWQgdG8gQUFBCiMgVVNFIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcm90aWQgKGxlZnQgJiByaWdodCkKIyBVU0UgLSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW1vcmFsL2lsaWFjIChsZWZ0LCByaWdodCBvciBib3RoIHNpZGVzKQojIE5PVCBVU0UgLSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBjYXJvdGlkIGFydGVyaWVzIChjb21tb24sIGV4dGVybmFsKQojIE5PVCBVU0UgLSA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJvdGlkIGJ5cGFzcyBhbmQgaW5qdXJ5IChsZWZ0LCByaWdodCBvciBib3RoIHNpZGVzKQojIE5PVCBVU0UgLSA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ldXJ5c21hdGEgKGNhcm90aWQgJiBmZW1vcmFsKQojIE5PVCBVU0UgLSA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3J0YQojIE5PVCBVU0UgLSA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBhcnRlcmllcyAocmVuYWwsIHBvcGxpdGVhbCwgdmVydGVicmFsKQojIE5PVCBVU0UgLSA4ICAgICAgICAgICAgICAgICAgICAgICAgZmVtb3JhbCBieXBhc3MsIGFuZ2lvc2VhbCBhbmQgaW5qdXJ5IChsZWZ0LCByaWdodCBvciBib3RoIHNpZGVzKQoKIyMjIEFFZGF0YSRpbmZvcm1lZGNvbnNlbnQKIyAgICAgICAgICAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwKIyBOT1QgVVNFIC0gLTk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZwojIE5PVCBVU0UgLSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBkaWVkCiMgVVNFIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcwojIFVTRSAtIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUKIyBVU0UgLSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBoZWFsdGggdHJlYXRtZW50CiMgVVNFIC0gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIE5PVCBVU0UgLSA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzCiMgTk9UIFVTRSAtIDYgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gcXVlc3Rpb25uYWlyZXMsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSA5ICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzCiMgVVNFIC0gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBOT1QgVVNFIC0gMTEgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudAojIE5PVCBVU0UgLSAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZSwgbm8gaGVhbHRoIHRyZWF0bWVudAojIE5PVCBVU0UgLSAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcwojIE5PVCBVU0UgLSAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZQojIFVTRSAtIDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzCiMgVVNFIC0gMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzCiMgTk9UIFVTRSAtIDIxICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvCiMgTk9UIFVTRSAtIDIyICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8KIyBVU0UgLSAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvCiMgVVNFIC0gMjYgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbwojIE5PVCBVU0UgLSAyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIGRvZXNuJ3Qgd2FudCB0bwojIE5PVCBVU0UgLSAyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCB1bmFibGUgdG8gc2lnbgojIE5PVCBVU0UgLSAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBubyByZWFjdGlvbgojIE5PVCBVU0UgLSAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgbG9zdAojIE5PVCBVU0UgLSAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgdG9vIG9sZAojIE5PVCBVU0UgLSAzNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8sIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSAzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKQojIFVTRSAtIDM2ICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlCiMgTk9UIFVTRSAtIDM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIGVuZHBvaW50CiMgVVNFIC0gMzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWwgbmlldHMgaW52dWxsZW4sIHdlbCBhbGxlcyBnZWJydWlrZW4KIyBVU0UgLSAzOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgaW5mb3JtZWQgY29uY2VudHM6IHllcywgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIE5PVCBVU0UgLSA0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vb2l0IGdlaW5jbHVkZWVyZAoKY2F0KCItIHNhbml0eSBjaGVja2luZyBQUklPUiB0byBzZWxlY3Rpb24iKQpsaWJyYXJ5KGRhdGEudGFibGUpCnJlcXVpcmUobGFiZWxsZWQpCmFlLmdlbmRlciA8LSB0b19mYWN0b3IoQUVEQiRHZW5kZXIpCmFlLmhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCJEhvc3BpdGFsKQp0YWJsZShhZS5nZW5kZXIsIGFlLmhvc3BpdGFsLCBkbm4gPSBjKCJTZXgiLCAiSG9zcGl0YWwiKSkKYWUuYXJ0ZXJ5IDwtIHRvX2ZhY3RvcihBRURCJEFydGVyeV9zdW1tYXJ5KQp0YWJsZShhZS5hcnRlcnksIGFlLmdlbmRlciwgZG5uID0gYygiU2V4IiwgIkFydGVyeSIpKQoKcm0oYWUuZ2VuZGVyLCBhZS5ob3NwaXRhbCwgYWUuYXJ0ZXJ5KQoKIyBJIGNoYW5nZSBudW1lcmljIGFuZCBmYWN0b3JzIG1hbnVhbGx5IGJlY2F1c2UsIHdlbGwsIEkgd291bGRuJ3Qga25vdyBob3cgdG8gZml4IGl0IG90aGVyd2lzZQojIHRvIGhhdmUgdGhpcyAndGliYmxlJyB3b3JrIHdpdGggJ3RhYmxlb25lJy4uLiA6LSkKCkFFREIkQWdlIDwtIGFzLm51bWVyaWMoQUVEQiRBZ2UpCkFFREIkZGlhc3RvbGkgPC0gYXMubnVtZXJpYyhBRURCJGRpYXN0b2xpKQpBRURCJHN5c3RvbGljIDwtIGFzLm51bWVyaWMoQUVEQiRzeXN0b2xpYykKCkFFREIkVENfZmluYWxDVSA8LSBhcy5udW1lcmljKEFFREIkVENfZmluYWxDVSkKQUVEQiRMRExfZmluYWxDVSA8LSBhcy5udW1lcmljKEFFREIkTERMX2ZpbmFsQ1UpCkFFREIkSERMX2ZpbmFsQ1UgPC0gYXMubnVtZXJpYyhBRURCJEhETF9maW5hbENVKQpBRURCJFRHX2ZpbmFsQ1UgPC0gYXMubnVtZXJpYyhBRURCJFRHX2ZpbmFsQ1UpCgpBRURCJFRDX2ZpbmFsIDwtIGFzLm51bWVyaWMoQUVEQiRUQ19maW5hbCkKQUVEQiRMRExfZmluYWwgPC0gYXMubnVtZXJpYyhBRURCJExETF9maW5hbCkKQUVEQiRIRExfZmluYWwgPC0gYXMubnVtZXJpYyhBRURCJEhETF9maW5hbCkKQUVEQiRUR19maW5hbCA8LSBhcy5udW1lcmljKEFFREIkVEdfZmluYWwpCgpBRURCJEFnZSA8LSBhcy5udW1lcmljKEFFREIkQWdlKQpBRURCJEdGUl9NRFJEIDwtIGFzLm51bWVyaWMoQUVEQiRHRlJfTURSRCkKQUVEQiRCTUkgPC0gYXMubnVtZXJpYyhBRURCJEJNSSkKQUVEQiRlQ2lnYXJldHRlcyA8LSBhcy5udW1lcmljKEFFREIkZUNpZ2FyZXR0ZXMpCkFFREIkZVBhY2tZZWFyc1Ntb2tpbmcgPC0gYXMubnVtZXJpYyhBRURCJGVQYWNrWWVhcnNTbW9raW5nKQpBRURCJEVQX2NvbXBvc2l0ZV90aW1lIDwtIGFzLm51bWVyaWMoQUVEQiRFUF9jb21wb3NpdGVfdGltZSkKCkFFREIkbWFjbWVhbjAgPC0gYXMubnVtZXJpYyhBRURCJG1hY21lYW4wKQpBRURCJHNtY21lYW4wIDwtIGFzLm51bWVyaWMoQUVEQiRzbWNtZWFuMCkKQUVEQiRuZXV0cm9waGlscyA8LSBhcy5udW1lcmljKEFFREIkbmV1dHJvcGhpbHMpCkFFREIkTWFzdF9jZWxsc19wbGFxdWUgPC0gYXMubnVtZXJpYyhBRURCJE1hc3RfY2VsbHNfcGxhcXVlKQpBRURCJHZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkIDwtIGFzLm51bWVyaWMoQUVEQiR2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCkKCnJlcXVpcmUobGFiZWxsZWQpCkFFREIkT1J5ZWFyIDwtIHRvX2ZhY3RvcihBRURCJE9SeWVhcikKQUVEQiRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIkR2VuZGVyKQpBRURCJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCJEhvc3BpdGFsKQpBRURCJEtET1FJIDwtIHRvX2ZhY3RvcihBRURCJEtET1FJKQpBRURCJEJNSV9XSE8gPC0gdG9fZmFjdG9yKEFFREIkQk1JX1dITykKQUVEQiREaWFiZXRlc1N0YXR1cyA8LSB0b19mYWN0b3IoQUVEQiREaWFiZXRlc1N0YXR1cykKQUVEQiRTbW9rZXJTdGF0dXMgPC0gdG9fZmFjdG9yKEFFREIkU21va2VyU3RhdHVzKQpBRURCJEFsY29ob2xVc2UgPC0gdG9fZmFjdG9yKEFFREIkQWxjb2hvbFVzZSkKCkFFREIkSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uMSkKQUVEQiRIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWcgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uMikKQUVEQiRIeXBlcnRlbnNpb24uY29tcG9zaXRlIDwtIHRvX2ZhY3RvcihBRURCJEh5cGVydGVuc2lvbi5jb21wb3NpdGUpCkFFREIkSHlwZXJ0ZW5zaW9uLmRydWdzIDwtIHRvX2ZhY3RvcihBRURCJEh5cGVydGVuc2lvbi5kcnVncykKCkFFREIkTWVkLmFudGljb2FndWxhbnRzIDwtIHRvX2ZhY3RvcihBRURCJE1lZC5hbnRpY29hZ3VsYW50cykKQUVEQiRNZWQuYWxsLmFudGlwbGF0ZWxldCA8LSB0b19mYWN0b3IoQUVEQiRNZWQuYWxsLmFudGlwbGF0ZWxldCkKQUVEQiRNZWQuU3RhdGluLkxMRCA8LSB0b19mYWN0b3IoQUVEQiRNZWQuU3RhdGluLkxMRCkKCkFFREIkU3Ryb2tlX0R4IDwtIHRvX2ZhY3RvcihBRURCJFN0cm9rZV9EeCkKQUVEQiRDQURfaGlzdG9yeSA8LSB0b19mYWN0b3IoQUVEQiRDQURfaGlzdG9yeSkKQUVEQiRQQU9EIDwtIHRvX2ZhY3RvcihBRURCJFBBT0QpCkFFREIkUGVyaXBoZXJhbC5pbnRlcnYgPC0gdG9fZmFjdG9yKEFFREIkUGVyaXBoZXJhbC5pbnRlcnYpCgpBRURCJHN5bXB0IDwtIHRvX2ZhY3RvcihBRURCJHN5bXB0KQpBRURCJFN5bXB0b21zLjNnIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjNnKQpBRURCJFN5bXB0b21zLjRnIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjRnKQpBRURCJFN5bXB0b21zLjVHIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjVHKQpBRURCJEFzeW1wdFN5bXB0IDwtIHRvX2ZhY3RvcihBRURCJEFzeW1wdFN5bXB0KQpBRURCJEFzeW1wdFN5bXB0MkcgPC0gdG9fZmFjdG9yKEFFREIkQXN5bXB0U3ltcHQyRykKCkFFREIkcmVzdGVub3MgPC0gdG9fZmFjdG9yKEFFREIkcmVzdGVub3MpCkFFREIkc3Rlbm9zZSA8LSB0b19mYWN0b3IoQUVEQiRzdGVub3NlKQpBRURCJEVQX2NvbXBvc2l0ZSA8LSB0b19mYWN0b3IoQUVEQiRFUF9jb21wb3NpdGUpCkFFREIkTWFjcm9waGFnZXMuYmluIDwtIHRvX2ZhY3RvcihBRURCJE1hY3JvcGhhZ2VzLmJpbikKQUVEQiRTTUMuYmluIDwtIHRvX2ZhY3RvcihBRURCJFNNQy5iaW4pCkFFREIkSVBILmJpbiA8LSB0b19mYWN0b3IoQUVEQiRJUEguYmluKQpBRURCJENhbGMuYmluIDwtIHRvX2ZhY3RvcihBRURCJENhbGMuYmluKQpBRURCJENvbGxhZ2VuLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRDb2xsYWdlbi5iaW4pCkFFREIkRmF0LmJpbl8xMCA8LSB0b19mYWN0b3IoQUVEQiRGYXQuYmluXzEwKQpBRURCJEZhdC5iaW5fNDAgPC0gdG9fZmFjdG9yKEFFREIkRmF0LmJpbl80MCkKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlIDwtIHRvX2ZhY3RvcihBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGUpCgpBRURCJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCJEFydGVyeV9zdW1tYXJ5KQoKQUVEQiRpbmZvcm1lZGNvbnNlbnQgPC0gdG9fZmFjdG9yKEFFREIkaW5mb3JtZWRjb25zZW50KQoKQUVEQi5DRUEgPC0gc3Vic2V0KEFFREIsCiAgICAgICAgICAgICAgICAgICAgKEFydGVyeV9zdW1tYXJ5ID09ICJjYXJvdGlkIChsZWZ0ICYgcmlnaHQpIiB8IEFydGVyeV9zdW1tYXJ5ID09ICJvdGhlciBjYXJvdGlkIGFydGVyaWVzIChjb21tb24sIGV4dGVybmFsKSIpICYgIyB3ZSBvbmx5IHdhbnQgY2Fyb3RpZHMKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm1pc3NpbmciICYgIyB3ZSBhcmUgcmVhbGx5IHN0cmljdCBpbiBzZWxlY3RpbmcgYmFzZWQgb24gJ2luZm9ybWVkIGNvbnNlbnQnIQogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRpZWQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIGhlYWx0aCB0cmVhdG1lbnQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkb2Vzbid0IHdhbnQgdG8iICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB1bmFibGUgdG8gc2lnbiIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIG5vIHJlYWN0aW9uIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgbG9zdCIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHRvbyBvbGQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGVuZHBvaW50IiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJub29pdCBnZWluY2x1ZGVlcmQiICYgCiAgICAgICAgICAgICAgICAgICAgICFpcy5uYShBc3ltcHRTeW1wdDJHKSkKIyBBRURCLkNFQVsxOjEwLCAxOjEwXQpkaW0oQUVEQi5DRUEpCmBgYAoKCmBgYHtyIEJhc2VsaW5lIEFFREI6IGNyZWF0aW9ufQpjYXQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpCmNhdCgiQ1JFQVRFIEJBU0VMSU5FIFRBQkxFXG4iKQoKIyBCYXNlbGluZSB0YWJsZSB2YXJpYWJsZXMKYmFzZXRhYmxlX3ZhcnMgPSBjKCJIb3NwaXRhbCIsICJPUnllYXIiLAogICAgICAgICAgICAgICAgICAgIkFnZSIsICJHZW5kZXIiLCAKICAgICAgICAgICAgICAgICAgICJUQ19maW5hbENVIiwgIkxETF9maW5hbENVIiwgIkhETF9maW5hbENVIiwgIlRHX2ZpbmFsQ1UiLCAKICAgICAgICAgICAgICAgICAgICJUQ19maW5hbCIsICJMRExfZmluYWwiLCAiSERMX2ZpbmFsIiwgIlRHX2ZpbmFsIiwgCiAgICAgICAgICAgICAgICAgICAic3lzdG9saWMiLCAiZGlhc3RvbGkiLCAiR0ZSX01EUkQiLCAiQk1JIiwgCiAgICAgICAgICAgICAgICAgICAiS0RPUUkiLCAiQk1JX1dITyIsIAogICAgICAgICAgICAgICAgICAgIlNtb2tlclN0YXR1cyIsICJBbGNvaG9sVXNlIiwKICAgICAgICAgICAgICAgICAgICJEaWFiZXRlc1N0YXR1cyIsIAogICAgICAgICAgICAgICAgICAgIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0IiwgIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0ZHJ1ZyIsICJIeXBlcnRlbnNpb24uY29tcG9zaXRlIiwgIkh5cGVydGVuc2lvbi5kcnVncyIsIAogICAgICAgICAgICAgICAgICAgIk1lZC5hbnRpY29hZ3VsYW50cyIsICJNZWQuYWxsLmFudGlwbGF0ZWxldCIsICJNZWQuU3RhdGluLkxMRCIsIAogICAgICAgICAgICAgICAgICAgIlN0cm9rZV9EeCIsICJzeW1wdCIsICJTeW1wdG9tcy41RyIsICJBc3ltcHRTeW1wdCIsICJBc3ltcHRTeW1wdDJHIiwKICAgICAgICAgICAgICAgICAgICJyZXN0ZW5vcyIsICJzdGVub3NlIiwKICAgICAgICAgICAgICAgICAgICJDQURfaGlzdG9yeSIsICJQQU9EIiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwgCiAgICAgICAgICAgICAgICAgICAiRVBfY29tcG9zaXRlIiwgIkVQX2NvbXBvc2l0ZV90aW1lIiwKICAgICAgICAgICAgICAgICAgICJtYWNtZWFuMCIsICJzbWNtZWFuMCIsICJNYWNyb3BoYWdlcy5iaW4iLCAiU01DLmJpbiIsCiAgICAgICAgICAgICAgICAgICAibmV1dHJvcGhpbHMiLCAiTWFzdF9jZWxsc19wbGFxdWUiLAogICAgICAgICAgICAgICAgICAgIklQSC5iaW4iLCAidmVzc2VsX2RlbnNpdHlfYXZlcmFnZWQiLAogICAgICAgICAgICAgICAgICAgIkNhbGMuYmluIiwgIkNvbGxhZ2VuLmJpbiIsIAogICAgICAgICAgICAgICAgICAgIkZhdC5iaW5fMTAiLCAiRmF0LmJpbl80MCIsICJPdmVyYWxsUGxhcXVlUGhlbm90eXBlIikKCmJhc2V0YWJsZV9iaW4gPSBjKCJHZW5kZXIiLCAKICAgICAgICAgICAgICAgICAgIktET1FJIiwgIkJNSV9XSE8iLCAKICAgICAgICAgICAgICAgICAgIlNtb2tlclN0YXR1cyIsICJBbGNvaG9sVXNlIiwKICAgICAgICAgICAgICAgICAgIkRpYWJldGVzU3RhdHVzIiwgCiAgICAgICAgICAgICAgICAgICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIsICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWciLCAiSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSIsICJIeXBlcnRlbnNpb24uZHJ1Z3MiLCAKICAgICAgICAgICAgICAgICAgIk1lZC5hbnRpY29hZ3VsYW50cyIsICJNZWQuYWxsLmFudGlwbGF0ZWxldCIsICJNZWQuU3RhdGluLkxMRCIsIAogICAgICAgICAgICAgICAgICAiU3Ryb2tlX0R4IiwgInN5bXB0IiwgIlN5bXB0b21zLjVHIiwgIkFzeW1wdFN5bXB0IiwgIkFzeW1wdFN5bXB0MkciLAogICAgICAgICAgICAgICAgICAicmVzdGVub3MiLCAic3Rlbm9zZSIsCiAgICAgICAgICAgICAgICAgICJDQURfaGlzdG9yeSIsICJQQU9EIiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwgCiAgICAgICAgICAgICAgICAgICJFUF9jb21wb3NpdGUiLCAiTWFjcm9waGFnZXMuYmluIiwgIlNNQy5iaW4iLAogICAgICAgICAgICAgICAgICAiSVBILmJpbiIsIAogICAgICAgICAgICAgICAgICAiQ2FsYy5iaW4iLCAiQ29sbGFnZW4uYmluIiwgCiAgICAgICAgICAgICAgICAgICJGYXQuYmluXzEwIiwgIkZhdC5iaW5fNDAiLCAiT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSIpCiMgYmFzZXRhYmxlX2JpbgoKYmFzZXRhYmxlX2NvbiA9IGJhc2V0YWJsZV92YXJzWyFiYXNldGFibGVfdmFycyAlaW4lIGJhc2V0YWJsZV9iaW5dCiMgYmFzZXRhYmxlX2NvbgpgYGAKCiMjIyBBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5OiBiYXNlbGluZSBjaGFyYWN0ZXJpc3RpY3MKU2hvd2luZyB0aGUgYmFzZWxpbmUgdGFibGUgb2YgdGhlIHdob2xlIEF0aGVyby1FeHByZXNzIEJpb2JhbmsuCmBgYHtyIEJhc2VsaW5lIEFFREI6IFZpc3VhbGl6ZX0KIyBDcmVhdGUgYmFzZWxpbmUgdGFibGVzCiMgaHR0cDovL3JzdHVkaW8tcHVicy1zdGF0aWMuczMuYW1hem9uYXdzLmNvbS8xMzMyMV9kYTMxNDYzM2RiOTI0ZGM3ODk4NmE4NTA4MTNhNTBkNS5odG1sCkFFREIuQ0VBLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZhY3RvclZhcnMgPSBiYXNldGFibGVfYmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RyYXRhID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEFFREIuQ0VBLCBpbmNsdWRlTkEgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubm9ybWFsID0gYygpLCBtaXNzaW5nID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZSA9IEZBTFNFLCBub1NwYWNlcyA9IEZBTFNFLCBzaG93QWxsTGV2ZWxzID0gVFJVRSwgZXhwbGFpbiA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJwZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnREaWdpdHMgPSAzKVssMTozXQoKYGBgCgoKIyMgQUVTQ1JOQTogYmFzZWxpbmUgY2hhcmFjdGVyaXN0aWNzCgpgYGB7ciBCYXNlbGluZTogY3JlYXRpb259Cm1ldGFkYXRhIDwtIHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEgJT4lIGFzX3RpYmJsZSgpCnNjUk5Bc2VxRGF0YU1ldGEgPC0gbWV0YWRhdGEgJT4lIGRpc3RpbmN0KFBhdGllbnQsIC5rZWVwX2FsbCA9IFRSVUUpCgpzY1JOQXNlcURhdGFNZXRhQUUgPC0gbWVyZ2Uoc2NSTkFzZXFEYXRhTWV0YSwgQUVEQiwgYnkueCA9ICJQYXRpZW50IiwgYnkueSA9ICJTVFVEWV9OVU1CRVIiLCBzb3J0ID0gRkFMU0UsIGFsbC54ID0gVFJVRSkKZGltKHNjUk5Bc2VxRGF0YU1ldGFBRSkKCiMgUmVwbGFjZSBtaXNzaW5nIGRhdGEgCiMgUmVmOiBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvbmFuaWFyL3ZpZ25ldHRlcy9yZXBsYWNlLXdpdGgtbmEuaHRtbApyZXF1aXJlKG5hbmlhcikKCm5hX3N0cmluZ3MgPC0gYygiTkEiLCAiTiBBIiwgIk4gLyBBIiwgIk4vQSIsICJOLyBBIiwgCiAgICAgICAgICAgICAgICAiTm90IEF2YWlsYWJsZSIsICJOb3QgYXZhaWxhYmxlIiwgCiAgICAgICAgICAgICAgICAibWlzc2luZyIsIAogICAgICAgICAgICAgICAgIi05OTkiLCAiLTk5IiwgCiAgICAgICAgICAgICAgICAiTm8gZGF0YSBhdmFpbGFibGUvbWlzc2luZyIsICJObyBkYXRhIGF2YWlsYWJsZS9NaXNzaW5nIikKIyBUaGVuIHlvdSB3cml0ZSB+LnggJWluJSBuYV9zdHJpbmdzIC0gd2hpY2ggcmVhZHMgYXMg4oCcZG9lcyB0aGlzIHZhbHVlIG9jY3VyIGluIHRoZSBsaXN0IG9mIE5BIHN0cmluZ3PigJ0uCgpzY1JOQXNlcURhdGFNZXRhQUUgJT4lCiAgcmVwbGFjZV93aXRoX25hX2FsbChjb25kaXRpb24gPSB+LnggJWluJSBuYV9zdHJpbmdzKQoKY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikKY2F0KCJTRUxFQ1RJT04gVEhFIFNISVpaTEUiKQoKY2F0KCItIHNhbml0eSBjaGVja2luZyBQUklPUiB0byBzZWxlY3Rpb24iKQpsaWJyYXJ5KGRhdGEudGFibGUpCnJlcXVpcmUobGFiZWxsZWQpCmFlLmdlbmRlciA8LSB0b19mYWN0b3Ioc2NSTkFzZXFEYXRhTWV0YUFFJEdlbmRlcikKYWUuaG9zcGl0YWwgPC0gdG9fZmFjdG9yKHNjUk5Bc2VxRGF0YU1ldGFBRSRIb3NwaXRhbCkKdGFibGUoYWUuZ2VuZGVyLCBhZS5ob3NwaXRhbCwgZG5uID0gYygiU2V4IiwgIkhvc3BpdGFsIiksIHVzZU5BID0gImlmYW55IikKCmFlLmFydGVyeSA8LSB0b19mYWN0b3Ioc2NSTkFzZXFEYXRhTWV0YUFFJEFydGVyeV9zdW1tYXJ5KQp0YWJsZShhZS5hcnRlcnksIGFlLmdlbmRlciwgZG5uID0gYygiU2V4IiwgIkFydGVyeSIpLCB1c2VOQSA9ICJpZmFueSIpCgphZS5pYyA8LSB0b19mYWN0b3Ioc2NSTkFzZXFEYXRhTWV0YUFFJGluZm9ybWVkY29uc2VudCkKdGFibGUoYWUuaWMsIGFlLmdlbmRlciwgdXNlTkEgPSAiaWZhbnkiKQoKcm0oYWUuZ2VuZGVyLCBhZS5ob3NwaXRhbCwgYWUuYXJ0ZXJ5LCBhZS5pYykKCgpzY1JOQXNlcURhdGFNZXRhQUUuYWxsIDwtIHN1YnNldChzY1JOQXNlcURhdGFNZXRhQUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXJ0ZXJ5X3N1bW1hcnkgPT0gImNhcm90aWQgKGxlZnQgJiByaWdodCkiIHwgQXJ0ZXJ5X3N1bW1hcnkgPT0gIm90aGVyIGNhcm90aWQgYXJ0ZXJpZXMgKGNvbW1vbiwgZXh0ZXJuYWwpIiApICYgIyB3ZSBvbmx5IHdhbnQgY2Fyb3RpZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJtaXNzaW5nIiAmICMgd2UgYXJlIHJlYWxseSBzdHJpY3QgaW4gc2VsZWN0aW5nIGJhc2VkIG9uICdpbmZvcm1lZCBjb25zZW50JyEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgZGllZCIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmljYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBoZWFsdGggdHJlYXRtZW50IiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZSIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8iICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgZG9lc24ndCB3YW50IHRvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHVuYWJsZSB0byBzaWduIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIG5vIHJlYWN0aW9uIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGxvc3QiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgdG9vIG9sZCIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8gKG5ldmVyIGFza2VkIGZvciBJQyBiZWNhdXNlIHRoZXJlIHdhcyBubyB0aXNzdWUpIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGVuZHBvaW50IiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm9vaXQgZ2VpbmNsdWRlZXJkIikKIyBzY1JOQXNlcURhdGFNZXRhQUUuYWxsWzE6MTAsIDE6MTBdCmRpbShzY1JOQXNlcURhdGFNZXRhQUUuYWxsKQojIERUOjpkYXRhdGFibGUoc2NSTkFzZXFEYXRhTWV0YUFFLmFsbCkKCmBgYAoKU2hvd2luZyB0aGUgYmFzZWxpbmUgdGFibGUuCmBgYHtyIEJhc2VsaW5lOiBWaXN1YWxpemV9CmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpCmNhdCgiQ1JFQVRFIEJBU0VMSU5FIFRBQkxFIikKCiMgQ3JlYXRlIGJhc2VsaW5lIHRhYmxlcwojIGh0dHA6Ly9yc3R1ZGlvLXB1YnMtc3RhdGljLnMzLmFtYXpvbmF3cy5jb20vMTMzMjFfZGEzMTQ2MzNkYjkyNGRjNzg5ODZhODUwODEzYTUwZDUuaHRtbApzY1JOQXNlcURhdGFNZXRhQUUuYWxsLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZhY3RvclZhcnMgPSBiYXNldGFibGVfYmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RyYXRhID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNjUk5Bc2VxRGF0YU1ldGFBRS5hbGwsIGluY2x1ZGVOQSA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25ub3JtYWwgPSBjKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gRkFMU0UsIHNob3dBbGxMZXZlbHMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udERpZ2l0cyA9IDMpWywxOjJdCgpgYGAKCldyaXRpbmcgdGhlIGJhc2VsaW5lIHRhYmxlIHRvIEV4Y2VsIGZvcm1hdC4gCmBgYHtyIEJhc2VsaW5lOiB3cml0ZX0KIyBXcml0ZSBiYXNldGFibGUKcmVxdWlyZShvcGVueGxzeCkKd3JpdGUueGxzeChmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIixUb2RheSwiLiIsUFJPSkVDVE5BTUUsIi5BRS5CYXNlbGluZVRhYmxlLnNjUk5Bc2VxLnhsc3giKSwgCiAgICAgICAgICAgZm9ybWF0KHNjUk5Bc2VxRGF0YU1ldGFBRS5hbGwudGFibGVPbmUsIGRpZ2l0cyA9IDUsIHNjaWVudGlmaWMgPSBGQUxTRSkgLCByb3cubmFtZXMgPSBUUlVFLCBjb2wubmFtZXMgPSBUUlVFKQoKCmBgYAoKCiMgQUVTQ1JOQQoKIyMgUXVhbGl0eSBjb250cm9sCkhlcmUgcmV2aWV3IHRoZSBudW1iZXIgb2YgY2VsbHMgcGVyIHNhbXBsZSwgcGxhdGUsIGFuZCBwYXRpZW50cy4gQW5kIHBsb3QgdGhlIHJhdGlvJ3MgcGVyIHNhbXBsZSBhbmQgc3R1ZHkgbnVtYmVyLgpgYGB7ciBRdWFsaXR5Q29udHJvbH0KIyMgY2hlY2sgc3R1ZmYKY2F0KCJcbkhvdyBtYW55IGNlbGxzIHBlciB0eXBlIC4uLj8iKQpzb3J0KHRhYmxlKHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEkU0NUX3Nubl9yZXMuMC44KSkKCmNhdCgiXG5cbkhvdyBtYW55IGNlbGxzIHBlciBwbGF0ZSAuLi4/IikKc29ydCh0YWJsZShzY1JOQXNlcURhdGFAbWV0YS5kYXRhJElEKSkKCmNhdCgiXG5cbkhvdyBtYW55IGNlbGxzIHBlciB0eXBlIHBlciBwbGF0ZSAuLi4/IikKdGFibGUoc2NSTkFzZXFEYXRhQG1ldGEuZGF0YSRTQ1Rfc25uX3Jlcy4wLjgsIHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEkSUQpCgpjYXQoIlxuXG5Ib3cgbWFueSBjZWxscyBwZXIgcGF0aWVudCAuLi4/IikKc29ydCh0YWJsZShzY1JOQXNlcURhdGFAbWV0YS5kYXRhJFBhdGllbnQpKQoKY2F0KCJcblxuVmlzdWFsaXppbmcgdGhlc2UgcmF0aW8ncyBwZXIgc3R1ZHkgbnVtYmVyIGFuZCBzYW1wbGUgLi4uPyIpClVNQVBQbG90KHNjUk5Bc2VxRGF0YSwgbGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMS4yNSwgbGFiZWwuc2l6ZSA9IDQsIGdyb3VwLmJ5ID0gImlkZW50IiwKICAgICAgICAgcmVwZWwgPSBUUlVFKQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlVNQVAucG5nIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5VTUFQLnBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCgpiYXJwbG90KHByb3AudGFibGUoeCA9IHRhYmxlKHNjUk5Bc2VxRGF0YUBhY3RpdmUuaWRlbnQsIHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEkUGF0aWVudCkpLCAKICAgICAgICBjZXguYXhpcyA9IDEuMCwgY2V4Lm5hbWVzID0gMC41LCBsYXMgPSAxLAogICAgICAgIGNvbCA9IHVpdGhvZl9jb2xvciwgeGxhYiA9ICJzdHVkeSBudW1iZXIiLCBsZWdlbmQudGV4dCA9IEZBTFNFLCBhcmdzLmxlZ2VuZCA9IGxpc3QoeCA9ICJib3R0b20iKSkKZGV2LmNvcHkocGRmLCBwYXN0ZTAoUUNfbG9jLCAiLyIsIFRvZGF5LCAiLmNlbGxfcmF0aW9zX3Blcl9zYW1wbGUucGRmIikpCmRldi5vZmYoKQoKYmFycGxvdChwcm9wLnRhYmxlKHggPSB0YWJsZShzY1JOQXNlcURhdGFAYWN0aXZlLmlkZW50LCBzY1JOQXNlcURhdGFAbWV0YS5kYXRhJElEKSksIAogICAgICAgIGNleC5heGlzID0gMS4wLCBjZXgubmFtZXMgPSAwLjUsIGxhcyA9IDIsCiAgICAgICAgY29sID0gdWl0aG9mX2NvbG9yLCB4bGFiID0gInNhbXBsZSBJRCIsIGxlZ2VuZC50ZXh0ID0gRkFMU0UsIGFyZ3MubGVnZW5kID0gbGlzdCh4ID0gImJvdHRvbSIpKQpkZXYuY29weShwZGYsIHBhc3RlMChRQ19sb2MsICIvIiwgVG9kYXksICIuY2VsbF9yYXRpb3NfcGVyX3NhbXBsZV9wZXJfcGxhdGUucGRmIikpCmRldi5vZmYoKQoKCgpgYGAKCiMjIFZpc3VhbGlzYXRpb25zCgpMZXQncyBwcm9qZWN0IGtub3duIGNlbGx1bGFyIG1hcmtlcnMuCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiB0U05FIEV4cGxvcmF0aW9ufQoKVU1BUFBsb3Qoc2NSTkFzZXFEYXRhLCBsYWJlbCA9IEZBTFNFLCBwdC5zaXplID0gMS4yNSwgbGFiZWwuc2l6ZSA9IDQsIGdyb3VwLmJ5ID0gImlkZW50IiwKICAgICAgICAgcmVwZWwgPSBUUlVFKQoKIyBlbmRvdGhlbGlhbCBjZWxscwpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQ0QzNCIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiRUROMSIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiRUROUkEiLCAiRUROUkIiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNESDUiLCAiUEVDQU0xIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJBQ0tSMSIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQoKIyBTTUMKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIk1ZSDExIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJMR0FMUzMiLCAiQUNUQTIiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKCiMgbWFjcm9waGFnZXMKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNEMTQiLCAiQ0Q2OCIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQ0QzNiIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQoKIyB0LWNlbGxzCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJDRDNFIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJDRDQiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKIyBGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQ0Q4IiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCgojIGItY2VsbHMKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNENzlBIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCgojIG1hc3QgY2VsbHMKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIktJVCIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQoKIyBOSyBjZWxscwpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiTkNBTTEiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKCmBgYAoKCiMjIFRhcmdldHMgb2YgaW50ZXJlc3Q6IAoKV2UgY2hlY2sgd2hldGhlciB0aGUgdGFyZ2V0cyBnZW5lcywgX2ByIHRhcmdldF9nZW5lc2BfLCB3ZXJlIHNlcXVlbmNlZCB1c2luZyBvdXIgbWV0aG9kIChTVEFSc2VxKS4gCgpTZXZlcmFsIGdlbmVzIGFyZSBub3QgcHJlc2VudCBvciBoYXZlIGRpZmZlcmVudCBuYW1lcywgdGhlc2UgYXJlIGxpc3RlZCBoZXJlLCBhbmQgd2VyZSBtYW51YWxseSByZW1vdmVkIGZyb20vY2hhbmdlZCBpbiB0aGUgbGlzdC4KCi0gX0FDMDExMjk0LjNfID09PiBub3QgZm91bmQKLSBfQzZvcmYxOTVfID0+IF9MSU5DMDE2MDBfIHJlcGxhY2VtZW50LCBub3QgZm91bmQKLSBfQzlvcmY1M18gPT4gX0NES04yQS1EVF8gcmVwbGFjZW1lbnQsIG5vdCBmb3VuZAotIF9BTDEzNzAyNi4xXyA9PT4gbm90IGZvdW5kCi0gX0RVUEQxXyA9PiBfRFVTUDI5XyByZXBsYWNlbWVudCwgbm90IGZvdW5kCi0gX1JQMTEtMTQ1RTUuNV8gPT0+IG5vdCBmb3VuZAotIF9QVlJMMl8gPT4gX05FQ1RJTjJfIHJlcGxhY2VtZW50Ci0gX0tJQUExNDYyXyA9PiBfSkNBRF8gcmVwbGFjZW1lbnQKLSBfWk5GMzJfID09PiBub3QgZm91bmQKLSBfQkNBTV8gPT0+IG5vdCBmb3VuZAoKYGBge3IgbGlzdCB0YXJnZXQgZ2VuZXN9CnRhcmdldF9nZW5lcwpgYGAKCiMjIyBFeHByZXNzaW9uIGluIGNlbGwgY29tbXVuaXRpZXMKYGBge3IgVmlzdWFsaXNhdGlvbjogcHJlcGFyYXRpb259Cgp0YXJnZXRfZ2VuZXNfcm0gPC0gYygiQUMwMTEyOTQuMyIsICJDNm9yZjE5NSIsICJDOW9yZjUzIiwgIkFMMTM3MDI2LjEiLCAiRFVQRDEiLCAiUlAxMS0xNDVFNS41IiwgIlBWUkwyIiwKICAgICAgICAgICAgICAgICAgICAgIlJQMS0yNTdBNy40IiwgIlJQMS0yNTdBNy41IiwgIktJQUExNDYyIiwKICAgICAgICAgICAgICAgICAgICAgIlpORjMyIiwgIkJDQU0iKQoKdGVtcCA9IHRhcmdldF9nZW5lc1shdGFyZ2V0X2dlbmVzICVpbiUgdGFyZ2V0X2dlbmVzX3JtXQoKdGFyZ2V0X2dlbmVzX3FjIDwtIGModGVtcCwgIk5FQ1RJTjIiLCAiSkNBRCIpCgp0YXJnZXRfZ2VuZXNfcWMKCmBgYAoKYGBge3IgVmlzdWFsaXNhdGlvbjogVGFyZ2V0cyBGZWF0dXJlIGFuZCBEb3QgUGxvdHMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoUkNvbG9yQnJld2VyKQoKcDEgPC0gRG90UGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gdGFyZ2V0X2dlbmVzX3FjLAogICAgICAgIGNvbHMgPSAiUmRCdSIpCgpwMSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0PTEsIHNpemUgPSA1KSkKCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuRG90UGxvdC5UYXJnZXRzLnBuZyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuRG90UGxvdC5UYXJnZXRzLnBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCnJtKHAxKQoKIyBGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYyh0YXJnZXRfZ2VuZXNfcWMpLAojICAgICAgICAgICAgIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIiwgIiM5QTM0ODAiLCIjMTI5MEQ5IiksCiMgICAgICAgICAgICAgY29tYmluZSA9IFRSVUUpCiMgCiMgZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5GZWF0dXJlUGxvdC5UYXJnZXRzLnBuZyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCiMgZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5GZWF0dXJlUGxvdC5UYXJnZXRzLnBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCgpgYGAKCmBgYHtyIFZpc3VhbGlzYXRpb246IFRhcmdldHN9CiMgVmxuUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gIkRVU1AyOSIpCgpmb3IgKEdFTkUgaW4gdGFyZ2V0X2dlbmVzX3FjKXsKICBwcmludChwYXN0ZTAoIlByb2plY3RpbmcgdGhlIGV4cHJlc3Npb24gb2YgIiwgR0VORSwgIi4iKSkKCiAgdnAxIDwtICBWbG5QbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBHRU5FKSArIAogICAgeGxhYigiY2VsbCBjb21tdW5pdGllcyIpICsgCiAgICB5bGFiKGJxdW90ZSgibm9ybWFsaXplZCBleHByZXNzaW9uIikpICsKICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwgCiAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwgCiAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAgIGdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVmxuUGxvdC4iLEdFTkUsIi5wbmciKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQogICAgZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5WbG5QbG90LiIsR0VORSwiLnBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKICAKICAjIHByaW50KHZwMSkKICAKfQoKYGBgCgoKCiMjIyBEaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBiZXR3ZWVuIGNlbGwgY29tbXVuaXRpZXMKCkhlcmUgd2UgcHJvamVjdCBnZW5lcyB0byBvbmx5IHRoZSBicm9hZCBjZWxsIGNvbW11bml0aWVzOiAKCi0gbWFjcm9waGFnZXMKLSBlbmRvdGhlbGlhbCBjZWxscwotIHNtb290aCBtdXNjbGUgY2VsbHMKLSBULWNlbGxzCi0gQi1jZWxscwotIE1hc3QgY2VsbHMKLSBOSy1jZWxscwotIE1peGVkIGNlbGxzCgoKIyMjIyBNYWNyb3BoYWdlcwoKQ29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBtYWNyb3BoYWdlcyBjZWxsIGNvbW11bml0aWVzIChfQ0QxNC9DRDY4XzxzdXA+Kzwvc3VwPiksIGFuZCBhbGwgb3RoZXIgY29tbXVuaXRpZXMuCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gTUFDIGNhbGN1bGF0ZX0KTl9HRU5FUz0yMDU1MgpNQUMubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCJDRDE0K0NENjgrIE0gSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJSSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygjIkNEMTQrQ0Q2OCsgTSBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyJDRDE0K0NENjgrIE0gSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIkNEMTQrQ0Q2OCsgTSBJSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4KyBUIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSSAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOCBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJIiwgIkNEMzQrIEVDIElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQ1RBMisgU01DIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5DQU0xKyBOSyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLSVQrIE1DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJSSIpKQoKRFQ6OmRhdGF0YWJsZShNQUMubWFya2VycykKYGBgCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIE1BQywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KTUFDX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oTUFDLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhNQUMubWFya2VycyksCiAgICB4ID0gImF2Z19sb2cyRkMiLAogICAgeSA9ICJwX3ZhbF9hZGoiLAogICAgc2VsZWN0TGFiID0gdGFyZ2V0X2dlbmVzX3FjLAogICAgYXhpc0xhYlNpemUgPSAxMiwKICAgIHhsYWIgPSAiYXZlcmFnZSBmb2xkLWNoYW5nZSIsCiAgICB0aXRsZSA9ICJNYWNyb3BoYWdlIG1hcmtlcnNcbihNYWNyb3BoYWdlIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHMgPWMoJ05TJywnYXZnLiBmb2xkLWNoYW5nZScsJ1AnLAogICAgICAnUCAmIGF2Zy4gZm9sZC1jaGFuZ2UnKSwKICAgIGxlZ2VuZFBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgIGxlZ2VuZEljb25TaXplID0gMy4wLAogICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgd2lkdGhDb25uZWN0b3JzID0gMC4yLAogICAgY29sQ29ubmVjdG9ycyA9ICIjNTk1QTVDIiwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLAogICAgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UpCk1BQ19Wb2xjYW5vX1RhcmdldHNBCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVm9sY2Fuby5NQUMuREVHLlRhcmdldHMucGRmIiksIAogICAgICAgcGxvdCA9IE1BQ19Wb2xjYW5vX1RhcmdldHNBKQpgYGAKClRoZSB0YXJnZXQgcmVzdWx0cyBhcmUgZ2l2ZW4gYmVsb3cgYW5kIHdyaXR0ZW4gdG8gYSBmaWxlLgpgYGB7ciBSZXN1bHRzIE1BQ30KbGlicmFyeSh0aWJibGUpCk1BQy5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oTUFDLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoTUFDLm1hcmtlcnMpLCAuYmVmb3JlID0gMSkKCnRlbXAgPC0gTUFDLm1hcmtlcnNbTUFDLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBNQUM6IHdyaXRpbmd9CmZ3cml0ZSh0ZW1wLCBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuTUFDLkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgoKIyMjIyBTbW9vdGggbXVzY2xlIGNlbGxzCgpDb21wYXJpc29uIGJldHdlZW4gdGhlIHNtb290aCBtdXNjbGUgY2VsbCBjb21tdW5pdGllcyAoX0FDVEEyXzxzdXA+Kzwvc3VwPiksIGFuZCBhbGwgb3RoZXIgY29tbXVuaXRpZXMuCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gU01DIGNhbGN1bGF0ZX0KTl9HRU5FUz0yMDU1MgpTTUMubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCJBQ1RBMisgU01DIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCJDRDE0K0NENjgrIE0gSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDgrIFQgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4IFQgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIEkiLCAiQ0QzNCsgRUMgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQUNUQTIrIFNNQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOQ0FNMSsgTksiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0lUKyBNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSUkiKSkKCkRUOjpkYXRhdGFibGUoU01DLm1hcmtlcnMpCmBgYAoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBTTUMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9ClNNQ19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKFNNQy5tYXJrZXJzLAogICAgbGFiID0gcm93bmFtZXMoU01DLm1hcmtlcnMpLAogICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgIHkgPSAicF92YWxfYWRqIiwKICAgIHNlbGVjdExhYiA9IHRhcmdldF9nZW5lc19xYywKICAgIGF4aXNMYWJTaXplID0gMTIsCiAgICB4bGFiID0gImF2ZXJhZ2UgZm9sZC1jaGFuZ2UiLAogICAgdGl0bGUgPSAiU01DIG1hcmtlcnNcbihTTUMgY29tbXVuaXRpZXMgdnMgdGhlIHJlc3QpIiwKICAgIHRpdGxlTGFiU2l6ZSA9IDE0LAogICAgcEN1dG9mZiA9IDAuMDUvTl9HRU5FUywgIyAyMDU1MiBnZW5lcwogICAgRkNjdXRvZmYgPSAxLjI1LAogICAgcG9pbnRTaXplID0gMS41LAogICAgbGFiU2l6ZSA9IDMuMCwKICAgIGxlZ2VuZExhYmVscyA9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKU01DX1ZvbGNhbm9fVGFyZ2V0c0EKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Wb2xjYW5vLlNNQy5ERUcuVGFyZ2V0cy5wZGYiKSwgCiAgICAgICBwbG90ID0gU01DX1ZvbGNhbm9fVGFyZ2V0c0EpCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCmBgYHtyIFJlc3VsdHMgU01DfQpsaWJyYXJ5KHRpYmJsZSkKU01DLm1hcmtlcnMgPC0gYWRkX2NvbHVtbihTTUMubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhTTUMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBTTUMubWFya2Vyc1tTTUMubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIFNNQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5TTUMuREVHLlRhcmdldHMudHh0IiksCiAgICAgICBxdW90ZSA9IEZBTFNFLAogICAgICAgc2VwID0gIlx0IiwgCiAgICAgICBzaG93UHJvZ3Jlc3MgPSBGQUxTRSwgdmVyYm9zZSA9IEZBTFNFKQpgYGAKCgojIyMjIEVuZG90aGVsaWFsIGNlbGxzCgpDb21wYXJpc29uIGJldHdlZW4gdGhlIGVuZG90aGVsaWFsIGNlbGwgY29tbXVuaXRpZXMgKF9DRDM0XzxzdXA+Kzwvc3VwPiksIGFuZCBhbGwgb3RoZXIgY29tbXVuaXRpZXMuCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gRUMgY2FsY3VsYXRlfQpOX0dFTkVTPTIwNTUyCkVDLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiQ0QzNCsgRUMgSSIsICJDRDM0KyBFQyBJSSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygiQ0QxNCtDRDY4KyBNIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4KyBUIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSSAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOCBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMzQrIEVDIEkiLCAiQ0QzNCsgRUMgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFDVEEyKyBTTUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOQ0FNMSsgTksiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0lUKyBNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSUkiKSkKCkRUOjpkYXRhdGFibGUoRUMubWFya2VycykKYGBgCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIEVDLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpFQ19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKEVDLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhFQy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIkVuZG90aGVsaWFsIGNlbGwgbWFya2Vyc1xuKEVDIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHMgPWMoJ05TJywnYXZnLiBmb2xkLWNoYW5nZScsJ1AnLAogICAgICAnUCAmIGF2Zy4gZm9sZC1jaGFuZ2UnKSwKICAgIGxlZ2VuZFBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgIGxlZ2VuZEljb25TaXplID0gMy4wLAogICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgd2lkdGhDb25uZWN0b3JzID0gMC4yLAogICAgY29sQ29ubmVjdG9ycyA9ICIjNTk1QTVDIiwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLAogICAgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UpCkVDX1ZvbGNhbm9fVGFyZ2V0c0EKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Wb2xjYW5vLkVDLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBFQ19Wb2xjYW5vX1RhcmdldHNBKQpgYGAKClRoZSB0YXJnZXQgcmVzdWx0cyBhcmUgZ2l2ZW4gYmVsb3cgYW5kIHdyaXR0ZW4gdG8gYSBmaWxlLgpgYGB7ciBSZXN1bHRzIEVDfQpsaWJyYXJ5KHRpYmJsZSkKRUMubWFya2VycyA8LSBhZGRfY29sdW1uKEVDLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoRUMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBFQy5tYXJrZXJzW0VDLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBFQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5FQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKIyMjIyBULWNlbGxzCgpDb21wYXJpc29uIGJldHdlZW4gdGhlIFQtY2VsbCBjb21tdW5pdGllcyAoX0NEMy9DRDQvQ0Q4XzxzdXA+Kzwvc3VwPiksIGFuZCBhbGwgb3RoZXIgY29tbXVuaXRpZXMuCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gVGNlbGwgY2FsY3VsYXRlfQpOX0dFTkVTPTIwNTUyClRDLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiQ0QzK0NEOCsgVCBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgSUkgIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDggVCBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJSUkiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoIkNEMTQrQ0Q2OCsgTSBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUlJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDMrQ0Q4KyBUIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMytDRDhBKyBUIElJICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMytDRDggVCBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDMrQ0Q0KyBUIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDMrQ0Q0KyBUIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQ0QzK0NENCsgVCBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNUQTIrIFNNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5DQU0xKyBOSyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLSVQrIE1DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJSSIpKQoKRFQ6OmRhdGF0YWJsZShUQy5tYXJrZXJzKQpgYGAKCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gVGNlbGwsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9ClRDX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oVEMubWFya2VycywKICAgIGxhYiA9IHJvd25hbWVzKFRDLm1hcmtlcnMpLAogICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgIHkgPSAicF92YWxfYWRqIiwKICAgIHNlbGVjdExhYiA9IHRhcmdldF9nZW5lc19xYywKICAgIGF4aXNMYWJTaXplID0gMTIsCiAgICB4bGFiID0gImF2ZXJhZ2UgZm9sZC1jaGFuZ2UiLAogICAgdGl0bGUgPSAiVC1jZWxsIG1hcmtlcnNcbihULWNlbGwgY29tbXVuaXRpZXMgdnMgdGhlIHJlc3QpIiwKICAgIHRpdGxlTGFiU2l6ZSA9IDE0LAogICAgcEN1dG9mZiA9IDAuMDUvTl9HRU5FUywgIyAyMDU1MiBnZW5lcwogICAgRkNjdXRvZmYgPSAxLjI1LAogICAgcG9pbnRTaXplID0gMS41LAogICAgbGFiU2l6ZSA9IDMuMCwKICAgIGxlZ2VuZExhYmVscyA9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKVENfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uVEMuREVHLlRhcmdldHMucGRmIiksIAogICAgICAgcGxvdCA9IFRDX1ZvbGNhbm9fVGFyZ2V0c0EpCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCmBgYHtyIFJlc3VsdHMgVEN9CmxpYnJhcnkodGliYmxlKQpUQy5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oVEMubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhUQy5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIFRDLm1hcmtlcnNbVEMubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIFRDOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLlRDLkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgoKIyMjIyBCLWNlbGxzCgpDb21wYXJpc29uIGJldHdlZW4gdGhlIEItY2VsbCBjb21tdW5pdGllcyAoX0NENzlBXzxzdXA+Kzwvc3VwPiksIGFuZCBhbGwgb3RoZXIgY29tbXVuaXRpZXMuCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gQmNlbGwgY2FsY3VsYXRlfQpOX0dFTkVTPTIwNTUyCkJDLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiQ0Q3OUErIEIgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJSSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygiQ0QxNCtDRDY4KyBNIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4KyBUIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSSAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOCBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJIiwgIkNEMzQrIEVDIElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQ1RBMisgU01DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTkNBTTErIE5LIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktJVCsgTUMiKSkKCkRUOjpkYXRhdGFibGUoQkMubWFya2VycykKYGBgCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIEJjZWxsLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpCQ19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKEJDLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhCQy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIkItY2VsbCBtYXJrZXJzXG4oQi1jZWxsIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHMgPWMoJ05TJywnYXZnLiBmb2xkLWNoYW5nZScsJ1AnLAogICAgICAnUCAmIGF2Zy4gZm9sZC1jaGFuZ2UnKSwKICAgIGxlZ2VuZFBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgIGxlZ2VuZEljb25TaXplID0gMy4wLAogICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgd2lkdGhDb25uZWN0b3JzID0gMC4yLAogICAgY29sQ29ubmVjdG9ycyA9ICIjNTk1QTVDIiwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLAogICAgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UpCkJDX1ZvbGNhbm9fVGFyZ2V0c0EKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Wb2xjYW5vLkJDLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBCQ19Wb2xjYW5vX1RhcmdldHNBKQpgYGAKClRoZSB0YXJnZXQgcmVzdWx0cyBhcmUgZ2l2ZW4gYmVsb3cgYW5kIHdyaXR0ZW4gdG8gYSBmaWxlLgpgYGB7ciBSZXN1bHRzIEJDfQpsaWJyYXJ5KHRpYmJsZSkKQkMubWFya2VycyA8LSBhZGRfY29sdW1uKEJDLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoQkMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBCQy5tYXJrZXJzW0JDLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBCQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5CQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKCiMjIyMgTWFzdCBjZWxscwoKQ29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBtYXN0IGNlbGwgY29tbXVuaXRpZXMgKF9LSVRfPHN1cD4rPC9zdXA+KSwgYW5kIGFsbCBvdGhlciBjb21tdW5pdGllcy4KYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBNYXN0IGNhbGN1bGF0ZX0KTl9HRU5FUz0yMDU1MgpNQy5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHNjUk5Bc2VxRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMSA9IGMoIktJVCsgTUMiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoIkNEMTQrQ0Q2OCsgTSBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUlJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOCsgVCBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgSUkgIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDggVCBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNUQTIrIFNNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5DQU0xKyBOSyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIktJVCsgTUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIElJIikpCgpEVDo6ZGF0YXRhYmxlKE1DLm1hcmtlcnMpCmBgYAoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBNYXN0LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpNQ19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKE1DLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhNQy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIk1hc3QgY2VsbCBtYXJrZXJzXG4oTWFzdCBjZWxsIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHMgPWMoJ05TJywnYXZnLiBmb2xkLWNoYW5nZScsJ1AnLAogICAgICAnUCAmIGF2Zy4gZm9sZC1jaGFuZ2UnKSwKICAgIGxlZ2VuZFBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgIGxlZ2VuZEljb25TaXplID0gMy4wLAogICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgd2lkdGhDb25uZWN0b3JzID0gMC4yLAogICAgY29sQ29ubmVjdG9ycyA9ICIjNTk1QTVDIiwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLAogICAgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UpCk1DX1ZvbGNhbm9fVGFyZ2V0c0EKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Wb2xjYW5vLk1DLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBNQ19Wb2xjYW5vX1RhcmdldHNBKQpgYGAKClRoZSB0YXJnZXQgcmVzdWx0cyBhcmUgZ2l2ZW4gYmVsb3cgYW5kIHdyaXR0ZW4gdG8gYSBmaWxlLgpgYGB7ciBSZXN1bHRzIE1DfQpsaWJyYXJ5KHRpYmJsZSkKTUMubWFya2VycyA8LSBhZGRfY29sdW1uKE1DLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoTUMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBNQy5tYXJrZXJzW01DLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBNQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5NQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKCiMjIyMgTkstY2VsbHMKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgbmF0dXJhbCBraWxsZXIgY2VsbCBjb21tdW5pdGllcyAoX05DQU0xXzxzdXA+Kzwvc3VwPiksIGFuZCBhbGwgb3RoZXIgY29tbXVuaXRpZXMuCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gTksgY2FsY3VsYXRlfQpOX0dFTkVTPTIwNTUyCk5LLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiTkNBTTErIE5LIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCJDRDE0K0NENjgrIE0gSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDgrIFQgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4IFQgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIEkiLCAiQ0QzNCsgRUMgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMiTkNBTTErIE5LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNUQTIrIFNNQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLSVQrIE1DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJSSIpKQoKRFQ6OmRhdGF0YWJsZShOSy5tYXJrZXJzKQpgYGAKCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gTkssIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Ck5LX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oTksubWFya2VycywKICAgIGxhYiA9IHJvd25hbWVzKE5LLm1hcmtlcnMpLAogICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgIHkgPSAicF92YWxfYWRqIiwKICAgIHNlbGVjdExhYiA9IHRhcmdldF9nZW5lc19xYywKICAgIGF4aXNMYWJTaXplID0gMTIsCiAgICB4bGFiID0gImF2ZXJhZ2UgZm9sZC1jaGFuZ2UiLAogICAgdGl0bGUgPSAiTksgbWFya2Vyc1xuKE5LLWNlbGwgY29tbXVuaXRpZXMgdnMgdGhlIHJlc3QpIiwKICAgIHRpdGxlTGFiU2l6ZSA9IDE0LAogICAgcEN1dG9mZiA9IDAuMDUvTl9HRU5FUywgIyAyMDU1MiBnZW5lcwogICAgRkNjdXRvZmYgPSAxLjI1LAogICAgcG9pbnRTaXplID0gMS41LAogICAgbGFiU2l6ZSA9IDMuMCwKICAgIGxlZ2VuZExhYmVscyA9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKTktfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uTksuREVHLlRhcmdldHMucGRmIiksIAogICAgICAgcGxvdCA9IE5LX1ZvbGNhbm9fVGFyZ2V0c0EpCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCmBgYHtyIFJlc3VsdHMgTkt9CmxpYnJhcnkodGliYmxlKQpOSy5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oTksubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhOSy5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIE5LLm1hcmtlcnNbTksubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIE5LOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLk5LLkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgojIyMjIE1peGVkIGNlbGxzCgpDb21wYXJpc29uIGJldHdlZW4gdGhlIG1peGVkIGNlbGwgY29tbXVuaXRpZXMsIGFuZCBhbGwgb3RoZXIgY29tbXVuaXRpZXMuCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gTUlYRUQgY2FsY3VsYXRlfQpOX0dFTkVTPTIwNTUyCk1JWEVELm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiTWl4ZWQgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJSSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygiQ0QxNCtDRDY4KyBNIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4KyBUIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSSAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOCBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJIiwgIkNEMzQrIEVDIElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJNaXhlZCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiTWl4ZWQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNUQTIrIFNNQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOQ0FNMSsgTksiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0lUKyBNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSUkiKSkKCkRUOjpkYXRhdGFibGUoTUlYRUQubWFya2VycykKYGBgCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIE1JWEVELCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpNSVhFRF9Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKE1JWEVELm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhNSVhFRC5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIk1peGVkIG1hcmtlcnNcbihNaXhlZCBjZWxsIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHMgPWMoJ05TJywnYXZnLiBmb2xkLWNoYW5nZScsJ1AnLAogICAgICAnUCAmIGF2Zy4gZm9sZC1jaGFuZ2UnKSwKICAgIGxlZ2VuZFBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgIGxlZ2VuZEljb25TaXplID0gMy4wLAogICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgd2lkdGhDb25uZWN0b3JzID0gMC4yLAogICAgY29sQ29ubmVjdG9ycyA9ICIjNTk1QTVDIiwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLAogICAgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UpCk1JWEVEX1ZvbGNhbm9fVGFyZ2V0c0EKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Wb2xjYW5vLk1JWEVELkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBNSVhFRF9Wb2xjYW5vX1RhcmdldHNBKQpgYGAKClRoZSB0YXJnZXQgcmVzdWx0cyBhcmUgZ2l2ZW4gYmVsb3cgYW5kIHdyaXR0ZW4gdG8gYSBmaWxlLgpgYGB7ciBSZXN1bHRzIE1JWEVEfQpsaWJyYXJ5KHRpYmJsZSkKTUlYRUQubWFya2VycyA8LSBhZGRfY29sdW1uKE1JWEVELm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoTUlYRUQubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBNSVhFRC5tYXJrZXJzW01JWEVELm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBNSVhFRDogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5NSVhFRC5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKCiMgU2Vzc2lvbiBpbmZvcm1hdGlvbgoKLS0tLS0tCgogICAgVmVyc2lvbjogICAgICB2MS4wLjEKICAgIExhc3QgdXBkYXRlOiAgMjAyMS0wMy0xMQogICAgV3JpdHRlbiBieTogICBTYW5kZXIgVy4gdmFuIGRlciBMYWFuIChzLncudmFuZGVybGFhbi0yW2F0XXVtY3V0cmVjaHQubmwpLgogICAgRGVzY3JpcHRpb246ICBTY3JpcHQgdG8gbG9hZCBzaW5nbGUtY2VsbCBSTkEgc2VxdWVuY2luZyAoc2NSTkFzZXEpIGRhdGEsIGFuZCBwZXJmb3JtIHF1YWxpdHkgY29udHJvbCAoUUMpLCBhbmQgaW5pdGlhbCBtYXBwaW5nIHRvIGNlbGxzLgogICAgTWluaW11bSByZXF1aXJlbWVudHM6IFIgdmVyc2lvbiAzLjUuMiAoMjAxOC0xMi0yMCkgLS0gJ0VnZ3NoZWxsIElnbG9vJywgbWFjT1MgTW9qYXZlICgxMC4xNC4yKS4KICAgIAogICAgQ2hhbmdlIGxvZwogICAgKiB2MS4wLjEgVXBkYXRlIHRvIHRoZSBnZW5lIGxpc3QuCiAgICAqIHYxLjAuMCBJbml0aWFsIHZlcnNpb24KCi0tLS0tLQoKYGBge3IgZXZhbCA9IFRSVUV9CnNlc3Npb25JbmZvKCkKYGBgCgojIFNhdmluZyBlbnZpcm9ubWVudApgYGB7ciBTYXZpbmd9CnNhdmUuaW1hZ2UocGFzdGUwKFBST0pFQ1RfbG9jLCAiLyIsVG9kYXksIi4iLFBST0pFQ1ROQU1FLCIuc2NybmFzZXFfcmVzdWx0cy5SRGF0YSIpKQpgYGAKCi0tLS0tLQo8c3VwPiZjb3B5OyAxOTc5LTIwMjEgU2FuZGVyIFcuIHZhbiBkZXIgTGFhbiB8IHMudy52YW5kZXJsYWFuLTJbYXRddW1jdXRyZWNodC5ubCB8IFtzd3ZhbmRlcmxhYW4uZ2l0aHViLmlvXShodHRwczovL3N3dmFuZGVybGFhbi5naXRodWIuaW8pLjwvc3VwPgotLS0tLS0KCg==